플로이드 와샬(Floyd Warshall) 알고리즘

임시온·2023년 4월 6일
0

플로이드 와샬(Floyd Warshall)

모든 정점 에서 모든 정점으로의 최단 경로를 구하고 싶을 때 플로이드 와샬 알고리즘을 사용해야함 , 거처가는 정점(노드)을 기준으로 최단 거리를 구하는 것이 특징이다. 또한 2차원 배열을 사용함.

노드가 자신을 포함한 모든 노드에 대해 비용을 계산하고 점차 값을 비교 하면서 수정을 해나가는 것이 특징이다.

노드노드1노드2노드3노드4노드5
노드1038무한-4
노드2무한0무한17
노드3무한40무한무한
노드42무한-5무한무한
노드5무한무한무한60

0은 자기 자신한테 가는 거라서 0이 되고 , 무한(INF) 은 경로가 없다는 것을 의미함
이제 이 테이블은 현재까지 계산된 최소 비용 테이블이 됨 , 다음은 이차원 배열을 반복적으로 돌아서 값을 갱신해야됨. 거처가는 정점을 기준으로 최단 거리를 찾아서 갱신을 함
노드2 에서 1로 가는 경로의 값과 다른 노드를 거쳐서 가는 값을 서로 비교해서 더 작은 값으로 교체를 함. 무한(INF) VS 2->4->1 = 3 이런식으로 비교해서 노드를 돌면서 값을 바꿈

최단경로

노드노드1노드2노드3노드4노드5
노드101-32-4
노드230-41-1
노드374053
노드42-1-50-2

이런 식으로 할 수 있다.

핵심 코드

for ( int k = 0 ; k < number ; k++ ) {
	for ( int i = 0 ; i < number ; i++ ) {
    	for ( int j = 0 ; j < number ; j++ ) {
        	if ( ary[i][k] + ary[k][j] < ary[i][j] ) {
            	ary[i][j] = ary[i][k] + ary[k][j];
            }
        }
    }
}

참고 사이트
https://blog.naver.com/ndb796/221234427842
https://ssungkang.tistory.com/entry/Algorithm-%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%99%80%EC%83%ACFloyd-Warshall-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

profile
🐧 끈기 있는 개발자

0개의 댓글