본문 바로가기

ProgramSoliving

백준 : 1939

반응형

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

 

1939번: 중량제한

첫째 줄에 N, M(1≤M≤100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리가 존재한다는 의미이다. 서로 같은 두 도시 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는

www.acmicpc.net

다잌스트라를 이용해서 접근 다만 가중치에 대해서 현재까지의 합을 저장하는것이아니라 현재 수량과 다리의 값중 min의 값을 선택해서 다음 섬으로 이동시킨다.

이때 너무많은 값을 q에 push할수 있어서 시간초과하 할수 있다.

따라서 도착지점의 값보다 현재 q에 들어있는 값이 작다면 희망없는 노드이기 때문에 버린다.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
public class B1939 {
    static int N,M;
    static class Pair implements Comparable<Pair>{
        int u;
        int c;
        public Pair(int u, int c) {
            super();
            this.u = u;
            this.c = c;
        }
        @Override
        public int compareTo(Pair o) {
            if(c<o.c) {
                return 1;
            }
            return -1;
        }
        
    }
    static ArrayList<Pair> list[];
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        
        list = new ArrayList[N+1];
        
        for(int n=1;n<=N;n++) {
            list[n] = new ArrayList<Pair>();
        }
        
        for(int m=0;m<M;m++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            
            list[u].add(new Pair(v,c));
            list[v].add(new Pair(u,c));
        }
        
        st = new StringTokenizer(br.readLine());
        int start = Integer.parseInt(st.nextToken());
        int end = Integer.parseInt(st.nextToken());
        
        int digit[] = new int[N+1];
        PriorityQueue<Pair> q = new PriorityQueue<>();
        
        q.add(new Pair(start,Integer.MAX_VALUE));
        while(!q.isEmpty()) {
            Pair tmp = q.poll();
            if(tmp.c < digit[end])continue;
            int size = list[tmp.u].size();
            
            for(int s=0;s<size;s++) {
                int next = list[tmp.u].get(s).u;
                int c = Math.min(list[tmp.u].get(s).c,tmp.c);
                if(digit[next] < c) {
                    digit[next] = c;
                    q.add(new Pair(next,c));
                }
            }
        }
        
        System.out.println(digit[end]);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 2234  (0) 2020.02.29
백준 : 1194  (0) 2020.02.29
백준 : 1726  (0) 2020.02.29
백준 : 12844  (0) 2020.02.28
백준 : 1395 (JAVA)  (0) 2020.02.28