티스토리 뷰

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

 

11404번: 플로이드

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

www.acmicpc.net

 

 

 

 

 

 

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

public class Main {
   static int[][] minCosts;
   static final int INF = 10000001;      //최대 비용 100000*100
   public static void main(String[] args) throws IOException {

      //input
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int n = Integer.parseInt(br.readLine());
      int m = Integer.parseInt(br.readLine());

      StringTokenizer stk;
      minCosts = new int[n + 1][n + 1];
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= n; j++) {
            minCosts[i][j] = INF;

            if (i == j)
               minCosts[i][j] = 0;
         }
      }
      for (int i = 0; i < m; i++) {
         stk = new StringTokenizer(br.readLine());
         int start = Integer.parseInt(stk.nextToken());
         int end = Integer.parseInt(stk.nextToken());
         int cost = Integer.parseInt(stk.nextToken());

         if (minCosts[start][end] == 0) {
            minCosts[start][end] = cost;
         } else {
            minCosts[start][end] = Math.min(minCosts[start][end], cost);
         }
      }

      //cal (i->k, k->j)
      for (int k = 1; k <= n; k++) {
         for (int i = 1; i <= n; i++) {
            int passBy = minCosts[i][k];
            if (passBy != 0) {
               for (int j = 1; j <= n; j++) {
                  if (i == j)
                     continue;
                  minCosts[i][j] =
                     Math.min(minCosts[i][j], minCosts[k][j] + passBy);
               }
            }
         }
      }

      //print
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
      StringBuilder sb = new StringBuilder();
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= n; j++) {
            if (minCosts[i][j] == INF)
               minCosts[i][j] = 0;
            sb.append(minCosts[i][j] + " ");
         }
         sb.append("\n");
      }
      bw.write(sb.toString());
      bw.flush();
      bw.close();
   }
}

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

[백준 1240] 노드 사이의 거리  (0) 2022.12.09
[백준 9997] 폰트  (0) 2022.10.27
[백준 1516] 게임 개발  (0) 2022.06.13
[백준 1750] 서로소의 개수  (0) 2022.05.26
[백준 2662] 기업투자  (0) 2022.05.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함