PS/Dijkstra

백준 24042번: 횡단보도 (Java)

닻과매 2022. 6. 12. 17:24

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

 

24042번: 횡단보도

당신은 집으로 가는 도중 복잡한 교차로를 만났다! 이 교차로에는 사람이 지나갈 수 있는 $N$ 개의 지역이 있고 그 지역 사이를 잇는 몇 개의 횡단보도가 있다. 모든 지역은 횡단보도를 통해 직,

www.acmicpc.net

 
 
 

 

문제 알고리즘을 파악하는 것이 쉽지 않은 문제인 듯하다. 다만 나는 다익스트라 문제집을 풀고 있었어서 기본적으로 뭔지는 알고 풀었다.

 

풀이

다익스트라인걸 알았으면, 각 횡단보도를 건넌 후, 도착한 시간에 따라 다음 횡단보도를 건널 수 있는 최소 시간을 적절히 구하면 된다.

 

코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.io.*;
import java.util.*;
 
public class Main {
    
    static final long INF = Long.MAX_VALUE;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        List<List<Edge>> graph = new ArrayList<>();
        for (int i = 0; i <= N; i++) {
            graph.add(new ArrayList<Edge>());
        }
        
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            graph.get(u).add(new Edge(v, i));
            graph.get(v).add(new Edge(u, i));
        }
        
        long[] d = new long[N+1];
        Arrays.fill(d, INF);
        PriorityQueue<Edge> pq = new PriorityQueue<>();
        pq.offer(new Edge(10));
        d[1= 0;
        while (!pq.isEmpty()) {
            Edge cur = pq.poll();
            int curLoc = cur.loc;
            long curDist = cur.dist;
            if (d[curLoc] < curDist) continue;
            for (Edge nxt: graph.get(curLoc)) {
                int nxtLoc = nxt.loc;
                long nxtDist;
                if (curDist <= nxt.dist) nxtDist = nxt.dist + 1;
                else {
                    nxtDist = ((long) Math.ceil(((double)curDist-nxt.dist)/M)) * M + nxt.dist + 1;
                }
                if (nxtDist < d[nxtLoc]) {
                    d[nxtLoc] = nxtDist;
                    pq.offer(new Edge(nxtLoc, nxtDist));
                }
            }
        }
        System.out.println(d[N]);
    }
    
    static class Edge implements Comparable<Edge> {
        int loc;
        long dist;
 
        public Edge(int loc, long dist) {
            this.loc = loc;
            this.dist = dist;
        }
 
        public int compareTo(Edge o) {
            return Long.compare(this.dist, o.dist);
        }
    }
}
 
cs