Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

uos-machine-learning

1865 - 웜홀 본문

알고리즘/문제풀이

1865 - 웜홀

이산한하루 2019. 5. 14. 18:10

정점이 N개일 때 최단 경로는 항상 최대 N-1개로 구성되므로 N단계에서 최단경로가 갱신되면 음수로 되어있는 사이클이 존재한다.

#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
struct point{
	int from;
	int to;
	int cost;
};
int n, m, w;
const int inf = 0x1fffffff;
int main(){
	int T;
	cin >> T;
	while (T--){
		cin >> n; cin >> m; cin >> w;
		vector<point> group;
		int dist[501];
		for (int i = 1; i <= n; i++){
			dist[i] = inf;
		}
		for (int i = 0; i < m; i++){
			int u, v, x;
			cin >> u >> v >> x;
			group.push_back({ u, v, x });
			group.push_back({ v, u, x });
		}
		for (int i = 0; i < w; i++){
			int u, v, x;
			cin >> u >> v >> x;
			group.push_back({ u, v, -x });
		}
		dist[1] = 0;
		bool negative = false;
		for (int i = 1; i <= n; i++){
			for (int j = 0; j < (m*2 + w); j++){
				int x = group[j].from;
				int y = group[j].to;
				int z = group[j].cost;
				if (dist[x] != inf && dist[y]>dist[x] + z){
					dist[y] = dist[x] + z;
					if (i == n){
						negative = true;
					}
				}
			}
		}
		if (negative){
			printf("YES\n");
		}
		else{
			printf("NO\n");
		}
	}
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

11404 - 플로이드  (0) 2019.05.14
11657 - 타임머신  (0) 2019.05.14
11403 - 경로 찾기  (0) 2019.05.11
1956 - 운동  (0) 2019.05.11
11779 - 최소비용 구하기  (0) 2019.05.11
Comments