유사한 문제

2020/07/06 - [알고리즘 공부] - boj 11657: 타임머신

 

boj 11657: 타임머신

벨만 포드 알고리즘: 정점 개수가 V개일 때, 최단 경로는 최대 V-1 개의 간선으로 이루어져 있다. 가중치가 음수인 경우도 사용 시간복잡도 O(VE) E <= V^2 이므로 시간복잡도는 O(V^3) 벨만 포드 알고��

sysgongbu.tistory.com

 

음수 사이클의 존재 여부를 찾는 문제이다.

주의할 점은 사이클이 웜홀을 포함하는지 여부이기 때문에 웜홀의 start가 시작점일때를 체크하도록 한다.

 

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int testcase = in.nextInt();
		for (int t = 0; t < testcase; t++) {

			int n = in.nextInt();
			int m = in.nextInt();
			int w = in.nextInt();

			List<Hole> holes = new ArrayList<Hole>();

			for (int i = 0; i < m; i++) {
				int start = in.nextInt();
				int end = in.nextInt();
				int time = in.nextInt();
				holes.add(new Hole(start, end, time));
				holes.add(new Hole(end, start, time));
			}

			HashSet<Integer> startSets = new HashSet<Integer>();
			for (int i = 0; i < w; i++) {
				int start = in.nextInt();
				int end = in.nextInt();
				int time = in.nextInt();
				startSets.add(start);
				holes.add(new Hole(start, end, -time));
			}

			boolean isNegativeCycle = false;
			Iterator it = startSets.iterator();
			while (it.hasNext()) {
				long dist[] = new long[n + 1];
				Arrays.fill(dist, Long.MAX_VALUE);
				dist[(int) it.next()] = 0;

				for (int i = 1; i <= n; i++) {
					for (int j = 0; j < holes.size(); j++) {
						int start = holes.get(j).start;
						int end = holes.get(j).end;
						int time = holes.get(j).time;

						if (dist[start] != Long.MAX_VALUE && dist[end] > dist[start] + time) {
							dist[end] = dist[start] + time;
							if (i == n) {
								isNegativeCycle = true;
							}
						}
					}
				}
				if (isNegativeCycle) {
					break;
				}
			}
			if (isNegativeCycle) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}
		}
	}
}

class Hole {
	int start, end, time;

	public Hole(int start, int end, int time) {
		this.start = start;
		this.end = end;
		this.time = time;
	}
}

 

'알고리즘 공부 > boj' 카테고리의 다른 글

boj 1753: 최단경로  (0) 2020.07.08
boj 1504: 특정한 최단 경로  (0) 2020.07.08
boj 11779: 최소비용 구하기 2  (0) 2020.07.07
boj 1916: 최소비용 구하기  (0) 2020.07.07
boj 11657: 타임머신  (0) 2020.07.06

+ Recent posts