알고리즘

[백준] 플로이드 11404 - java

minkang 2021. 7. 2. 10:43

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

 

11404번: 플로이드

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

www.acmicpc.net

public class 플로이드11404 {
	final static int INF = 100001;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int m = Integer.parseInt(br.readLine());
		
		int map[][] = new int[n+1][n+1];
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				if(map[i][j] == 0 && i!=j) {
					map[i][j] = INF;
				}
			}
		}
		
		
		for(int i=0; i<m; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			int value = Integer.parseInt(st.nextToken());
			map[from][to] = Math.min(value, map[from][to]);
		}
		
		for(int k=1; k<=n; k++) {
			for(int i=1; i<=n; i++) {
				for(int j=1; j<=n; j++) {
					if(map[i][j] > map[i][k] + map[k][j]) {
						map[i][j] = map[i][k] + map[k][j];
					}
				}
			}
		}
		
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				if(map[i][j] == INF) {
					System.out.print("0 ");
				}
				else {
					System.out.print(map[i][j]+" ");
				}
			}
			System.out.println();
		}
	}
}

플로이드 와샬 알고리즘은 모든 최단경로를 구하는 문제에 쓰입니다. 

특징으로는 음의 가중치를 갖고 있어도 사용할 수 있습니다.

시간 복잡도는 O(N^3)입니다. 

 

1. 인접행렬에 각 경로의 가중치 값을 입력받습니다.

2. 플로이드 와샬 알고리즘을 이용해 모든 경로에서 최단경로를 구합니다.

3. 결과를 출력합니다.