Java/백준

[Java][1238] 파티

tmd1 2023. 2. 22. 19:05

문제:

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

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

코드:

import java.util.*;
import java.io.*;

public class Main {
    public static int v,e,st,end;
    public static ArrayList<ArrayList<Pair>> arr = new ArrayList<>(1005);
    public static int INF = Integer.MAX_VALUE;
    public static int [] d = new int[1005];
    public static int [] pre = new int[1005];
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer stk = new StringTokenizer(br.readLine());
        v = Integer.parseInt(stk.nextToken());
        e = Integer.parseInt(stk.nextToken());
        end = Integer.parseInt(stk.nextToken());

        for(int i=1;i<v+5;i++){
            arr.add(new ArrayList<>());
        }
        for(int i=1;i<v+5;i++){
            d[i] = INF;
        }

        while(e-->0){
            StringTokenizer tmp = new StringTokenizer(br.readLine());

            int u = Integer.parseInt(tmp.nextToken());
            int v = Integer.parseInt(tmp.nextToken());
            int w = Integer.parseInt(tmp.nextToken()); // 가중치

            arr.get(u).add(new Pair(w,v));
        }

        int [] result = new int[1005];

        for(int i=1;i<=v;i++){
            PriorityQueue<Pair> pq = new PriorityQueue<>();
            d[i] = 0; // 시작점
            pq.add(new Pair(d[i],i));
            while(!pq.isEmpty()){
                Pair cur = pq.poll();
                if(d[cur.num] != cur.dis) continue;
                for(Pair nxt : arr.get(cur.num)){
                    if(d[nxt.num] <= d[cur.num] + nxt.dis) continue;
                    d[nxt.num] = d[cur.num] + nxt.dis;
                    pq.add(new Pair(d[nxt.num] , nxt.num));
                }
            }

            result[i] += d[end];

            for(int j=1;j<v+5;j++){
                d[j] = INF;
            }

            pq = new PriorityQueue<>();
            d[end] = 0; // 시작점
            pq.add(new Pair(d[end],end));
            while(!pq.isEmpty()){
                Pair cur = pq.poll();
                if(d[cur.num] != cur.dis) continue;
                for(Pair nxt : arr.get(cur.num)){
                    if(d[nxt.num] <= d[cur.num] + nxt.dis) continue;
                    d[nxt.num] = d[cur.num] + nxt.dis;
                    pq.add(new Pair(d[nxt.num] , nxt.num));
                }
            }

            result[i] += d[i];

            for(int j=1;j<v+5;j++){
                d[j] = INF;
            }
        }

        int maxTime = -1;
        for(int i=1;i<=v;i++){
            maxTime = Math.max(result[i], maxTime);
        }

        System.out.println(maxTime);


    }
}

class Pair implements Comparable<Pair>{
    int dis;
    int num;

    Pair(int dis, int num){
        this.dis = dis; // 거리
        this.num = num; // 정점번호
    }

    @Override
    public int compareTo(Pair o) {
        return this.dis - o.dis;
    }
}

 

다익스트라 두번 돌리면 해결