1
+ import org .w3c .dom .Node ;
2
+
3
+ import java .io .BufferedReader ;
4
+ import java .io .IOException ;
5
+ import java .io .InputStreamReader ;
6
+ import java .util .*;
7
+
8
+ // 시간복잡도 : N<=1,000, M<=100,000 O(NM) 가능
9
+ // 이웃집 모두에 떡을 돌리기 위한 최소 일을 출력
10
+ // 만약 모두 방문할수 없으면 -1을 출력
11
+ public class Main {
12
+ static class Node implements Comparable <Node >{
13
+ int house ;
14
+ int cost ;
15
+ Node (int house , int cost ){
16
+ this .house = house ;
17
+ this .cost = cost ;
18
+ }
19
+ public int compareTo (Node other ){
20
+ return this .cost - other .cost ;
21
+ }
22
+ }
23
+
24
+ static List <Node >[] graph ;
25
+ static int [] distance ;
26
+ public static void main (String [] args ) throws IOException {
27
+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
28
+ StringTokenizer st = new StringTokenizer (br .readLine ());
29
+ int N = Integer .parseInt (st .nextToken ()); // 집 개수
30
+ int M = Integer .parseInt (st .nextToken ()); // 도로 개수
31
+ int X = Integer .parseInt (st .nextToken ()); // 도로 길이 <= 1000000000
32
+ int Y = Integer .parseInt (st .nextToken ()); // 성현이 집
33
+
34
+ // 그래프 초기화
35
+ graph = new ArrayList [N ];
36
+ for (int i =0 ; i <N ; i ++){
37
+ graph [i ] = new ArrayList <>();
38
+ }
39
+
40
+ for (int i =0 ; i <M ; i ++){ // 도로 위치 입력 받기 -> 그래프?
41
+ st = new StringTokenizer (br .readLine ());
42
+ int A = Integer .parseInt (st .nextToken ());
43
+ int B = Integer .parseInt (st .nextToken ());
44
+ int C = Integer .parseInt (st .nextToken ());
45
+ graph [A ].add (new Node (B , C )); // A -> B 양방향
46
+ graph [B ].add (new Node (A , C )); // B -> A
47
+ }
48
+ distance = new int [N ];
49
+ Arrays .fill (distance , Integer .MAX_VALUE );
50
+ dijkstra (Y );
51
+
52
+ int days = 1 ; // 최소 일수(첫날 1일)
53
+ int totalDistance = 0 ;
54
+ Arrays .sort (distance );
55
+
56
+ for (int i = 0 ; i < N ; i ++) { // 거리 확인
57
+ if (i != Y ) { // 성현이의 집은 제외
58
+ if (distance [i ] * 2 > X ) { // 왕복 거리 초과
59
+ System .out .println (-1 ); // 방문x
60
+ return ;
61
+ }
62
+ if (totalDistance + distance [i ] * 2 > X ) { // 하루 이동 거리 초과
63
+ days ++; // 하루 추가
64
+ totalDistance = 0 ; // 새로운 날로 초기화
65
+ }
66
+ totalDistance += distance [i ] * 2 ; // 방문한 거리 추가
67
+ }
68
+ }
69
+ System .out .println (days ); // 최소 일수
70
+ }
71
+ public static void dijkstra (int start ) {
72
+ PriorityQueue <Node > pq = new PriorityQueue <>();
73
+ pq .add (new Node (start , 0 ));
74
+ distance [start ] = 0 ; // 시작 위치는 거리 0
75
+
76
+ while (!pq .isEmpty ()) {
77
+ Node cur = pq .poll ();
78
+ int curHouse = cur .house ;
79
+ int curCost = cur .cost ;
80
+
81
+ if (curCost > distance [curHouse ]) continue ;
82
+
83
+ for (int i = 0 ; i < graph [curHouse ].size (); i ++) {
84
+ Node neighbor = graph [curHouse ].get (i );
85
+ int newCost = distance [curHouse ] + neighbor .cost ;
86
+
87
+ if (newCost < distance [neighbor .house ]) {
88
+ distance [neighbor .house ] = newCost ;
89
+ pq .add (new Node (neighbor .house , newCost ));
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
0 commit comments