본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1238 파티

by 까망 하르방 2021. 2. 25.
반응형

출처: https://www.acmicpc.net/problem/1238

 Input 

4 8 2

1 2 4

1 3 2

1 4 7

2 1 1

2 3 5

3 1 2

3 4 4

4 2 3

 

 Output 

10

다른 정점들로부터 특정 정점까지의 최단 거리 비용을 구해야 하므로

플로이드 와샬 (Floyd Warshall)

 

플로이드 와샬 (Floyd Warshall)

개념 아래와 같은 가중 그래프에서 최단 경로를 찾는 알고리즘. ex) 정점 ③ → ⑤로 가는 최단 경로는 다음과 같습니다.    경로Path: ③ → ② → ④ → ① → ⑤ 비용Cost:  +4 +1 +2  -4 = 3..

zoosso.tistory.com

 

 

같은 내용의 문제이지만, 다익스트라 알고리즘을 이용해서 풀이 

[SWEA] 4007 간담회 참석

 

[SWEA] 4007 간담회 참석

출처: [SWEA] SW 문제해결 심화 - 그래프  Input 1 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3  Output #1 10 임의의 정점 [x]과 나머지 정점들을 [i]라고 했을 때, [i] → [x] → [i]까지..

zoosso.tistory.com

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
  
public class Main {
    public static final int INF = 1000000;
    public static int N, M, X;
    public static int[][] dist;
      
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        st = new StringTokenizer(br.readLine()); 
        N = Integer.parseInt(st.nextToken());
        dist = new int[N + 1][N + 1];
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N; j++) {
                if(i == j) continue;
                dist[i][j] = INF;
            }
        }
          
        M = Integer.parseInt(st.nextToken());
        X = Integer.parseInt(st.nextToken());
        while (M-- > 0) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int cost = Integer.parseInt(st.nextToken());
            dist[u][v] = cost;
        }
          
        // 플로이드 와샬 알고리즘
        floydWarshall();
          
        // 정답출력
        printAnswer();
    }
      
    public static void floydWarshall() {
        // 중간에 거쳐가는 정점 (k)
        for(int k = 1; k <= N; k++) {
            // 출발 정점 (i)
            for(int i=1; i <= N; i++) {
                // 도착 정점 (j)
                for(int j=1; j <= N; j++) {
                    // 기존에 저장된 최단 거리와 정점 k를 거쳐가는 (i → k) + (k → j) 경로 중 최소값
                    dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
    }
      
    public static void printAnswer() {
        StringBuilder sb = new StringBuilder();
        int answer = 0;
        for(int i=1; i <= N; i++) {
            if(i == X) continue;
            answer = Math.max(answer, dist[i][X] + dist[X][i]);
        }
        sb.append(answer);
        System.out.println(sb.toString());
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2983 개구리 공주  (8) 2021.02.25
[BOJ] 백준 3217 malloc  (0) 2021.02.25
[BOJ] 백준 2610 회의준비  (0) 2021.02.25
[BOJ] 백준 16466 콘서트  (0) 2021.02.25
[BOJ] 백준 7567 그릇  (0) 2021.02.25

댓글