λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜/문제

[μžλ°”] λ°±μ€€ 1956 - μš΄λ™

by applemango2021 2020. 12. 24.

μ‹œμž‘μ κ³Ό 도착점이 μ •ν•΄μ Έ μžˆμ§€ μ•Šκ³ , 경둜의 합이 κ°€μž₯ μž‘μ€ 사이클을 찾으면 λœλ‹€. 

사이클을 μ–΄λ–»κ²Œ 찾아낼지에 λŒ€ν•΄ μ–΄λ ΅κ²Œ μƒκ°ν–ˆλŠ”λ°, ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜ μ΄μš©ν•΄μ„œ dist[1][1], dist[2][2], ..., dist[V][V]의 값듀을 ν™•μΈν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€. 

 

λ„μ‹œμ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 400개이고, κ°„μ„ μ˜ κ°œμˆ˜λ„ μ΅œλŒ€ V(V-1)라고 ν–ˆμœΌλ‹ˆ μ΅œλŒ€ 16만개둜 보면 λœλ‹€. 

μ΅œλŒ€κ°’λ“€μ„ κΈ°μ€€μœΌλ‘œ μƒκ°ν–ˆμ„ λ•Œ, 간선은 16λ§Œλ²ˆμ„ 읽으면 되고, ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ€ 400 x 400 x 400μ΄λ‹ˆκΉŒ 6천 4백만 μ •λ„μ˜ μ—°μ‚°λ§Œ ν•„μš”ν•˜λ‹€. 

 

이 λ¬Έμ œκ°€ ν”Œλ‘œμ΄λ“œ μ›Œμ…œμ„ μ΄μš©ν•˜λ©΄ λœλ‹€λŠ” κ±Έ μ•Œκ³  λ‚˜λ©΄ μ—„μ²­ μ‰¬μš΄λ°, κ·Έκ±Έ μ•Œμ•„μ±Œ 짬이 λΆ€μ‘±ν•˜λ‹€

/* 2020.12.24(λͺ©) */
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

	static int MAX = 2000000000; 
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str = br.readLine().trim().split(" ");
		
		int V = Integer.parseInt(str[0]);
		int E = Integer.parseInt(str[1]);
		
		int[][] dist = new int[V+1][V+1];
		
		for(int i=1;i<=V;i++) {
			Arrays.fill(dist[i], MAX);
		}
		
		
		int s,e,d;
		for(int i=0;i<E;i++) {
			str = br.readLine().trim().split(" ");
			s = Integer.parseInt(str[0]);
			e = Integer.parseInt(str[1]);
			d = Integer.parseInt(str[2]);
			
			dist[s][e] = d;
		}
		
		//ν”Œλ‘œμ΄λ“œ μ›Œμ…œ 
		// k = κ²½μœ μ§€
		for(int k=1;k<=V;k++) {
			for(int a=1;a<=V;a++) {
				if(dist[a][k]== MAX) continue;
				for(int b=1;b<=V;b++) {
					if(dist[k][b]== MAX) continue;
					dist[a][b] = Math.min(dist[a][b], dist[a][k]+dist[k][b]);
				}
			}
		}
		
		int result = MAX;
		for(int a=1;a<=V;a++) {
			result = Math.min(result, dist[a][a]); 
		}
		
		if(result == MAX) System.out.println(-1);
		else System.out.println(result);
	}
}