2606 바이러스
알고리즘
플로이드 워셜
플로이드 워셜 알고리즘 다음과 같은 경우에 주로 사용된다.
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 사이에 선을 이어라. 정도가 되겠다.
알고리즘
플로이드 워셜
플로이드 워셜 알고리즘 다음과 같은 경우에 주로 사용된다.
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