본문 바로가기
백준

[JAVA] 백준 17396 - 백도어

by 맴썰 2025. 10. 5.

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

0 -> N까지의 최단경로를 구할 때, 갈 수 없는 정점을 피하며 갈 경우의 최단 경로를 구하는 문제이다.

정점 개수랑 가중치 범위를 제대로 안보고 가중치 배열을 int로 잡았다가 한번 틀렸다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] info = getArray(br.readLine());
        int[] sight = getArray(br.readLine());
        List<List<Roads>> list = new ArrayList<>();
        for (int i = 0; i < info[0]; i++) {
            list.add(new ArrayList<>());
        }
        for (int i = 0; i < info[1]; i++) {
            int[] road = getArray(br.readLine());
            list.get(road[0]).add(new Roads(road[1],road[2]));
            list.get(road[1]).add(new Roads(road[0],road[2]));
        }
        double[] dist = new double[info[0]];
        Arrays.fill(dist,100000d*300000d);
        dist[0] = 0;
        boolean[] visited = new boolean[info[0]];
        PriorityQueue<Spot> pq = new PriorityQueue<>();
        Spot start = new Spot(0);
        pq.offer(start);
        while(!pq.isEmpty()){
            Spot s = pq.poll();
            int v = s.v;
            double weight = dist[v];
            if(visited[v]) continue;
            visited[v] = true;
            List<Roads> rList = list.get(v);
            for (int i = 0; i < rList.size(); i++) {
                Roads r = rList.get(i);
                if(sight[r.to]==1&&r.to!= sight.length-1) continue;
                if(dist[r.to]> weight + r.cost){
                    dist[r.to] =  weight + r.cost;
                    Spot offer = new Spot(r.to);
                    offer.weight = dist[r.to];
                    pq.offer(offer);
                }
            }
        }
        double answer = dist[sight.length-1]==100000d*300000d?-1:dist[sight.length-1];
        System.out.printf("%.0f",answer);
    }
    static int par(String s) {
        return Integer.parseInt(s);
    }

    static int[] getArray(String s) {
        return Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
    }
}

class Spot implements Comparable<Spot>{
    int v;
    double weight = 0;
    Spot(int v){
        this.v=v;
    }

    @Override
    public int compareTo(Spot o) {
        return Double.compare(this.weight,o.weight);
    }
}

class Roads{
    int to;
    int cost;
    Roads(int t, int c){
        this.to = t;
        this.cost = c;
    }
}