본문 바로가기

백준

[백준] 1865 웜홀 [자바]

 


https://dragon-h.tistory.com/24?category=789780 

 

[백준 1865 : JAVA] 웜홀/ 벨만-포드

개요 문제를 읽어보면 음의 가중치가 있는 그래프에서 음의 사이클의 여부를 확인하는 문제라는 것을 알 수 있다. (음의 사이클이란 경로를 지날 때마다 계속 최단거리가 감소하는 것을 뜻한다.

dragon-h.tistory.com

https://www.acmicpc.net/board/view/72996

 

글 읽기 - 데이터를 추가해 주세요.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

※ 음수 사이클만 확인하면 되기 때문에 모든 시작점을 0으로 해놓고 벨만포드를 돌려야함.

    웜홀을 통과해 cost가 가장 적은 수(음수만) 를 dist에 저장해놓고 이것이 음수사이클을 발생시키는지 확인

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;

class Road {
	int start;
	int end;
	int cost;
	public Road(int start, int end, int cost) {
		this.start = start;
		this.end = end;
		this.cost = cost;
	}
}

public class Main {
	static int[] dist;
	static Road[] road;
	static int INF = Integer.MAX_VALUE;
	static int n;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		//StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int T = Integer.parseInt(br.readLine());
		while(T --> 0) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			n = Integer.parseInt(st.nextToken());
			int m = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			
			dist = new int[n+1];
			road = new Road[2*m+w];
			Arrays.fill(dist, INF);
			int index = 0;
			int start = 0;
			for(int i = 0; i < m; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				int s = Integer.parseInt(st.nextToken());
				int e = Integer.parseInt(st.nextToken());
				int t = Integer.parseInt(st.nextToken());
				dist[s] = 0;
				dist[e] = 0;
				road[index++] = new Road(s,e,t);
				road[index++] = new Road(e,s,t);
			}
			for(int i = 0; i < w; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				int s = Integer.parseInt(st.nextToken());
				int e = Integer.parseInt(st.nextToken());
				int t = Integer.parseInt(st.nextToken());
				dist[s] = 0;
				road[index++] = new Road(s,e,t * -1);
			}
			if(bellmanford()) {
				sb.append("YES").append('\n');
			}
			else {
				sb.append("NO").append('\n');
			}
		}
		System.out.println(sb);
	}
	static boolean bellmanford() {
		for(int i = 0; i < n; i++) {
			for(Road roads : road) {
				if(dist[roads.start] != INF && dist[roads.start] + roads.cost < dist[roads.end]) {
					dist[roads.end] = dist[roads.start] + roads.cost;
				}
			}
		}
		for(Road roads : road) {
			if(dist[roads.start] != INF && dist[roads.start] + roads.cost < dist[roads.end]) {
				return true;
			}
		}
		return false;
	}
}

'백준' 카테고리의 다른 글

[백준] 1300 K번째 수 [자바]  (0) 2022.08.29
[백준] 1007 벡터 매칭 [자바]  (0) 2022.08.17
[백준] 9465 스티커 [자바]  (0) 2022.06.21
[백준] 2096 내려가기 [자바]  (0) 2022.06.17
[백준] 10775 공항 [자바]  (0) 2022.06.07