반응형

 

[광고 누르면 오늘의 행운 상승!!]

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

 

11404번: 플로이드

첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우는 없다. 비용은 100,000보다 작거나 같은 자연수이다. 시작

www.acmicpc.net

플로이드 와샬 문제

2차원 배열을 이용해서 i -> j 도시로 가는 최소 비용을 구한다.

i-i 나 j-j 의 경우 0을 출력한다.

i : 출발지
j : 도착지
k : 경유지 

일때, i -> k + k -> j 와 i -> j 중 작은 값이 i -> j까지의 최소 거리이다.

package Study3;

import java.io.*;
import java.util.*;
 
public class 플로이드 {
    public static int city;
    public static int[][] dis;
    public static final int INF = 1000000000;
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        
        city = Integer.parseInt(br.readLine());
        int bus = Integer.parseInt(br.readLine());
        
        dis = new int[city][city];
        
        for(int i=0; i < city; i++) {
            for(int j=0; j < city; j++) {
                if(i == j) continue;
                dis[i][j] = INF;
            }
        }
        
        while(bus-- > 0) {
            st = new StringTokenizer(br.readLine());
            
            int A = Integer.parseInt(st.nextToken())-1;
            int B = Integer.parseInt(st.nextToken())-1;
            int D = Integer.parseInt(st.nextToken());
            
            dis[A][B] = Math.min(dis[A][B], D);    
        }
 
        floydWarshall();

        StringBuilder sb = new StringBuilder();
        for(int i=0; i < city; i++) {
            for(int j=0; j < city; j++) {
                if(dis[i][j] >= INF) sb.append("0 ");
                else sb.append(dis[i][j] + " ");
            }
            sb.append("\n");
        }
        
        System.out.println(sb.toString());
    }
    
    public static void floydWarshall() {
        // 경유노드 
        for(int k = 0; k < city; k++) {
            // 출발노드
            for(int i =0 ; i < city; i++) {
                // 도착노드
                for(int j = 0; j < city; j++) {
                    //i에서 k를 거쳤다가 k에서 j 까지 가는 거리와 i에서 j 까지 가는 거리를 비교해서 작은 값이 최소거리이다.
                    dis[i][j] = Math.min(dis[i][k] + dis[k][j], dis[i][j]);
                }
            }
        }
    }
}
반응형

+ Recent posts