본문 바로가기

알고리즘/백준

[백준] 1956 운동

문제링크: www.acmicpc.net/problem/1956

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

문제를 보자마자 플로이드 워셜로 모든 경로를 저장할 수 있다는 것을 알았다.

N이 400이기 때문이다.

정답을 제출한 다음 이것보다 더 빠른 속도를 보이는 풀이를 보니

배열을 초기화 할 때 Arrays.fill을 쓰는 것 같았다. 나도 넣어줬더니 제출결과가 30% 빠르게 나왔다.

import java.io.*;
import java.util.*;
public class Main {
	
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int V = Integer.parseInt(st.nextToken());
		int E = Integer.parseInt(st.nextToken());
		int [][]dist = new int[V+1][V+1];
		for(int i=1;i<=V;i++)
			Arrays.fill(dist[i],987654321);
		for(int i=0;i<E;i++){
			st = new StringTokenizer(br.readLine());
			int a=  Integer.parseInt(st.nextToken());
			int  b = Integer.parseInt(st.nextToken());
			int c=  Integer.parseInt(st.nextToken());
			dist[a][b] = c;
		}
		
		for(int i=1;i<=V;i++){
			for(int j=1;j<=V;j++){
				for(int k=1;k<=V;k++){
					if(dist[i][k] + dist[k][j] < dist[i][j]){
						dist[i][j] = dist[i][k]+dist[k][j];
					}
				}
			}
		}
		int ans = 987654321;
		for(int i=1;i<=V;i++){
			ans = Math.min(ans, dist[i][i]);
		}
		if(ans < 987654321)
		System.out.println(ans);
		else System.out.println(-1);
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 7579 앱  (0) 2020.12.29
[백준] 11066 파일 합치기  (0) 2020.12.29
[백준] 1504 특정한 최단 경로  (0) 2020.12.23
[백준] 11286 절대값 힙  (0) 2020.12.23
[백준] 1927 최소 힙  (0) 2020.12.23