<Algorithm> 75. 1507번 궁금한 민호(floyd)
by BFine반응형
1. 1507번 궁금한 민호
플로이드 워셜 알고리즘을 반대로 이용하는 문제
이미 최단경로가 주어져 있고 이를 이용해서 도로를 구하려면 반대로 거쳐가는 경로를 없애주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static boolean visited[]; public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int[][] arr = new int[N][N]; for(int i = 0; i < N; i ++) { StringTokenizer st = new StringTokenizer(br.readLine()); for(int j = 0; j < N; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } for(int k = 0; k < N; k++) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(k!=j && k!=i && i!=j && arr[i][j] != 0 && arr[i][k] != 0 && arr[k][j]!= 0) { if(arr[i][j] > arr[i][k] + arr[k][j]) { System.out.println(-1); return; }// 최단거리로 구한 경우인데 거쳐서 가는 경우가 더 최단거리이면 // 모순되므로 -1 if(arr[i][j] == arr[i][k] + arr[k][j]) { arr[i][j] = 0; }// 최단거리로 거쳐가는 경로와 최단거리값이 같은 경우 // 이 경로는 경유한 경로 이므로 // 인접경로가 아니기 때문에 0으로 지워준다. } } } } int total = 0; for(int i = 0; i < N; i++) { for(int j = i; j < N; j++){ if(arr[i][j] != 0) { total += arr[i][j]; } } } System.out.println(total); } } | cs |
참고 & 출처 http://mygumi.tistory.com/116
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 77. 1149번 RGB거리 (0) | 2018.09.07 |
---|---|
<Algorithm> 76. 5719번 거의 최단경로 (0) | 2018.09.05 |
<Algorithm> 74. 5567번 결혼식 (0) | 2018.09.03 |
<Algorithm> 73. 1068번 트리 (0) | 2018.09.03 |
<Algorithm> 72. 4963번 섬의 개수(DFS) (0) | 2018.09.01 |
블로그의 정보
57개월 BackEnd
BFine