반응형
문제 출처 :
https://www.acmicpc.net/problem/1865
알고리즘 분석 :
문제 해결에 필요한 사항
1. 벨만 포드 :: http://www.crocus.co.kr/search/%EB%B2%A8%EB%A7%8C%20%ED%8F%AC%EB%93%9C
벨만 포드 알고리즘을 지금까지 너무 어렵게 배운 것 같아 다시 배워야 할 것 같다.
이 문제는 그냥 벨만포드 알고리즘을 이용하면 되고, 사이클이 존재한다면 YES, 사이클이 존재하지 않는다면 NO를 출력하면 된다.
이때 사이클이 존재한다는 조건은 cnt == V인데
벨만포드 알고리즘 정의 상 총 라운드는 V-1번만 돌면 모든 최단 경로를 확인할 수 있다.
하지만 V - 1번 이후 V번째에도 최단 경로가 발견되었다면 그것은 음의 사이클이 존재한다는 의미이다.
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <cstdio> #include <vector> #include <limits.h> #include <memory.h> #define INF 987654321 using namespace std; typedef pair<int, int> pii; int main() { int dist[505]; int tCase; scanf("%d", &tCase); while (tCase--) { int V, E, Hole; int cnt = 0; vector<pii> adj[505]; scanf("%d %d %d", &V, &E, &Hole); for (int i = 0; i < E; i++) { int from, to, val; scanf("%d %d %d", &from, &to, &val); adj[from].push_back(make_pair(to, val)); adj[to].push_back(make_pair(from, val)); } for (int i = 0; i < Hole; i++) { int from, to, val; scanf("%d %d %d", &from, &to, &val); adj[from].push_back(make_pair(to, -val)); } for (int i = 0; i <= V; i++) dist[i] = INF; bool update = true; dist[1] = 0; while (update && cnt != V) { update = false; cnt++; for (int i = 1; i <= V; i++) { for (auto j : adj[i]) { if (dist[i] + j.second < dist[j.first]) { dist[j.first] = dist[i] + j.second; update = true; } } } } cnt == V ? printf("YES\n") : printf("NO\n"); } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1956번] 운동 (0) | 2017.03.25 |
---|---|
[2435번] 기상청 인턴 신현수 (0) | 2017.03.25 |
[1389번] 케빈 베이컨의 6단계 법칙 (0) | 2017.03.24 |
[1238번] 파티 (3) | 2017.03.24 |
[2565번] 전깃줄 (12) | 2017.03.23 |