코테 공부

[플로이드 워셜] 플로이드(백준 11404번, 자바)

DaEun_ 2023. 3. 7. 10:36

https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

 

 

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

public class Main_11404_플로이드 {

	static int n,m;
	static int[][] map;
	static StringBuilder sb=new StringBuilder();
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 n = Integer.parseInt(br.readLine());
		 m = Integer.parseInt(br.readLine());
		 
		 map=new int[n+1][n+1];
		 for(int i=0;i<m;i++) {
			 	StringTokenizer st=new StringTokenizer(br.readLine());
				int x=Integer.parseInt(st.nextToken());
				int y=Integer.parseInt(st.nextToken());
				int d=Integer.parseInt(st.nextToken());
				if(map[x][y]==0) map[x][y]=d;
				else if(map[x][y]>d) map[x][y]=d;

		 }
		 
		 for(int k=1;k<=n;k++) {
			 for(int i=1;i<=n;i++) {
				 for(int j=1;j<=n;j++) {
					 	if(i==j) continue; 
					 	if(map[i][k]>0 &&  map[k][j]>0) { //해당 버스가 존재한다면
					 		 if(map[i][j]==0) map[i][j]=map[i][k]+map[k][j];
							 else map[i][j]=Math.min(map[i][k]+map[k][j], map[i][j]);
					 	}
				 }
			 }
		 }
		 
		 for(int i=1;i<=n;i++) {
			 for(int j=1;j<=n;j++) {
				 sb.append(map[i][j]+" ");
			 }sb.append("\n");
		 }
		 System.out.println(sb.toString());
	}

}