알고리즘

플로이드 워셜

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

플로이드 워셜 알고리즘 다음과 같은 경우에 주로 사용된다.

1. i 노드에서 j노드까지 경로가 존재하는가?

이를 transitive closure 를 구함으로써 해결가능한데

if dp[i][j] = 1, when dp[i][k] = 1 and dp[k][j] = 1

와 같이 코드를 짜면된다. 위의 코드를 해석하자면,

i 에서 k 로 갈 수 있고, k 에서 j로 갈 수 있다면, i 와 j 사이에 선을 이어라. 정도가 되겠다.

알고리즘

플로이드 워셜

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

플로이드 워셜 알고리즘 다음과 같은 경우에 주로 사용된다.

2. i 노드에서 j노드까지 가는 최단 경로는? 혹은 최소 비용은? (이때 i,j 는 모든 노드가 가능)

이 부분은 익히 알고 있어서 따로 설명을 생략한다. 위의 링크타고 들어가서 보면된다.

 

추가 : )

다익스트라랑 플로이드 워셜의 차이? => 다익스트라는 한 노드에서 다른 노드들까지의 최소 비용을 구할 때 사용하고, 플로이드 워셜은 모든 노드들에서 다른 노드들까지의 최소 비용을 구할 때 사용한다.

소스코드

 

#include <iostream>
using namespace std;
int main() {
    std::ios::sync_with_stdio(false);
    int n, m, arr[101][101] = {0,};
    cin >> n >> m;
    while (m--) {
        int a, b;
        cin >> a >> b;
        arr[a][b] = 1;
        arr[b][a] = 1;
    }
    for (int k = 1; k <= n; ++k) {
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (i != j) {
                    if (arr[i][k] != 0 && arr[k][j] != 0) arr[i][j] = 1;
                }
            }
        }
    }
    int ans = 0;
    for (int l = 2; l <= n; ++l) {
        if (arr[1][l] == 1) ++ans;
    }
    cout << ans;
    return 0;
}

deck

By mingyun chae

deck

  • 505