합리적 낙관주의자

Baekjoon 11562번: 백양로 브레이크 본문

Computer Thinking 🌟/Algorithm 📝

Baekjoon 11562번: 백양로 브레이크

sroa.chin 2020. 4. 17. 03:54

 

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

 

11562번: 백양로 브레이크

서울 소재 Y모 대학교에서 대규모 공사를 진행하면서, 학교가 마치 미로처럼 변해버리고 말았다. 공사 이전까지는 어떤 건물에서 출발하더라도 다른 모든 건물로 갈 수 있는 길이 있었으나, 공사가 진행되면서 어떻게 한 건진 알 수 없지만 일방통행만 가능한 길이 많이 늘고 말았다. 컴퓨터과학과 학생 남규는 전공 수업을 듣고 교양 수업을 들으러 가던 중 길을 잃어 3일 밤낮을 헤매다가 공학관에서 종합관으로 가는 길은 존재하지 않는다는 결론을 내렸다. 3일 사이에

www.acmicpc.net

백양로 브레이크~

플로이드 워셜 알고리즘을 이용해 풀었다. 플로이드 워셜 알고리즘은 시간 복잡도가 O(n^3)이지만 구현이 쉽다. 

 

 

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

//백양로 브레이크
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		String[] sarr = str.split(" ");
		int n = Integer.parseInt(sarr[0]);
		int m = Integer.parseInt(sarr[1]);
		int[][] map = new int [n][n];
		
		for (int i = 0; i < n; i++) { // 행만큼만 반복
			Arrays.fill(map[i], 9999);
			map[i][i] = 0; // 자기자신 정점
		}
		
		int u = 0, v = 0, b = 0;
		for (int input = 0; input < m; input++) {
			str = br.readLine();
			sarr = str.split(" ");
			u = Integer.parseInt(sarr[0])-1;
			v = Integer.parseInt(sarr[1])-1;
			b = Integer.parseInt(sarr[2]);
			
			map[u][v] = 0;
			if(b == 0) {
				map[v][u] = 1;
			} else {
				map[v][u] = 0;
			}
		}//end of input for
		
		// 플로이드 워셜 
		for (int k = 0; k < n; k++) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					map[i][j] = Math.min(map[i][j], map[i][k]+map[k][j]);
				}
			}
		}
		
		int k = Integer.parseInt(br.readLine());
		for (int output = 0; output < k; output++) {
			str = br.readLine();
			sarr = str.split(" ");
			int s = Integer.parseInt(sarr[0]) - 1;
			int e = Integer.parseInt(sarr[1]) - 1;
			System.out.println(map[s][e]);
		}
	}//end of main
}//end of class