전체쌍 최단경로 문제는 Floyd-Warshall 알고리즘!

3가지 부분에 대해서 살펴보려고 한다

1) 두 정점을 연결하는 최단경로 구하기

2) 그래프에서 정점을 삭제

3) 두 정점을 연결하는 최단경로 구하기

전체쌍 최단경로 문제는 Floyd-Warshall 알고리즘

All pairs shortest path problem

2개 테이블 사용 

하나는 모든 경로에 대한 비용을 저장하는 테이블

하나는 각 정점까지 가기 직전의 정점을 저장한 테이블

점 X에서 0번을 통해 점 Y로 가는 최단거리를 찾아보자

1번 정점에서 0번 정점을 거쳐 다른 정점 y로 갈때 거리는

그냥 1->y보다 모두 길기때문에 1->0->y는 모두 무시

\

2번 정점에서 0번 정점을 거쳐 다른 정점 y로 갈때 거리는

그냥 2->y보다 모두 길기때문에 2->0->y는 모두 무시

\

3번 정점에서 0번 정점을 거쳐 다른 정점 y로 갈때 거리는

그냥 3->y보다 모두 길기때문에 3->0->y는 모두 무시

\

4번 정점에서 0번 정점을 거쳐 다른 정점 y로 갈때 거리는

그냥 4->y보다 모두 길기때문에 4->0->y는 모두 무시

// 초기화

for (int i =1; i <= n; i++){

for (int j =1; j <= n; j++){

d[i][j] = (i==j) ? 0 : INF;

}

}

// 두 정점 연결하는 간선 가중치 입력

for (int i =1; i <= n; i++){

for (int j =i+1; j <= n; j++){

int length = sc.nextInt();

if(length == 0) length = INF;

d[i][j] = d[j][i] = length;

}

}

// 플로이드 - 워셜 알고리즘으로 전체경로 대해 최단경로 찾기

for(int k =0; k < N; k++)

for(int i =0; i < N; i++)

for(int j =0; j < N; j++)

if(d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j];

// 그래프에서 정점을 삭제

void deleteVertex(int index)

 while(AdjList