1
- // T: O(N + E alp(N) )
2
- // S: O(N )
1
+ // T: O(V + EllogV )
2
+ // S: O(E + V )
3
3
4
- import java .security .cert .Certificate ;
5
- import java .util .ArrayList ;
6
- import java .util .LinkedList ;
7
- import java .util .List ;
4
+ import java .util .Comparator ;
5
+ import java .util .HashMap ;
6
+ import java .util .HashSet ;
7
+ import java .util .Map ;
8
+ import java .util .PriorityQueue ;
8
9
import java .util .Queue ;
9
-
10
+ import java . util . Set ;
10
11
11
12
12
13
public class HelloWorld {
13
- private static final List < List < Integer >> DIRECTIONS = List . of (
14
- List . of ( 1 , 0 ),
15
- List . of ( 0 , 1 ),
16
- List . of (- 1 , 0 ),
17
- List . of ( 0 , - 1 )
18
- );
14
+ private static final record Pair ( int vertex , int distance ) {}
15
+
16
+ public int networkDelayTime ( int [][] times , int n , int k ) {
17
+ final Map < Integer , Map < Integer , Integer >> graph = createGraph ( times );
18
+ final Map < Integer , Integer > distances = new HashMap <>();
19
+ final Queue < Pair > minHeap = new PriorityQueue <>( Comparator . comparingInt ( a -> a . distance ) );
19
20
20
- public int orangesRotting (int [][] grid ) {
21
- final Queue <int []> queue = new LinkedList <>();
22
- addRottenOrangesToQueue (queue , grid );
23
- int maxTime = 0 ;
21
+ minHeap .add (new Pair (k , 0 ));
24
22
25
- while (!queue .isEmpty ()) {
26
- final int [] info = queue .poll ();
27
- final int row = info [0 ], column = info [1 ], time = info [2 ];
23
+ while (!minHeap .isEmpty ()) {
24
+ final Pair pair = minHeap .poll ();
25
+ final int vertex = pair .vertex , distanceToVertex = pair .distance ;
26
+ final int currentVertexTime = distances .getOrDefault (vertex , Integer .MAX_VALUE );
28
27
29
- if (grid [ row ][ column ] == 0 ) {
28
+ if (currentVertexTime < distanceToVertex ) {
30
29
continue ;
31
30
}
32
31
33
- maxTime = Math .max (time , maxTime );
34
- grid [row ][column ] = 0 ;
35
-
36
- for (int [] neighbour : getNeighbours (grid , row , column )) {
37
- queue .add (new int [] { neighbour [0 ], neighbour [1 ], time + 1 });
38
- }
39
- }
32
+ distances .put (vertex , distanceToVertex );
40
33
41
- if (containsFreshOranges (grid )) {
42
- return -1 ;
43
- }
44
- return maxTime ;
45
- }
34
+ for (Map .Entry <Integer , Integer > entry : graph .getOrDefault (pair .vertex , new HashMap <>()).entrySet ()) {
35
+ final int neighbour = entry .getKey (), distance = entry .getValue ();
36
+ final int currentMinDistance = distances .getOrDefault (neighbour , Integer .MAX_VALUE );
37
+ final int minDistance = Math .min (currentMinDistance , distances .get (pair .vertex ) + distance );
46
38
47
- private static boolean containsFreshOranges (int [][] grid ) {
48
- for (int [] row : grid ) {
49
- for (int orange : row ) {
50
- if (orange == 1 ) {
51
- return true ;
39
+ if (minDistance < currentMinDistance ) {
40
+ distances .put (neighbour , minDistance );
41
+ minHeap .add (new Pair (neighbour , minDistance ));
52
42
}
53
43
}
54
44
}
55
- return false ;
45
+
46
+ return minTimeRequired (distances , n );
56
47
}
57
48
58
- private static void addRottenOrangesToQueue ( Queue < int []> queue , int [][] grid ) {
59
- for ( int row = 0 ; row < grid . length ; row ++) {
60
- for (int column = 0 ; column < grid [ 0 ]. length ; column ++ ) {
61
- if ( grid [ row ][ column ] == 2 ) {
62
- queue . add ( new int [] { row , column , 0 } );
63
- }
64
- }
49
+ private static Map < Integer , Map < Integer , Integer >> createGraph ( int [][] edges ) {
50
+ final Map < Integer , Map < Integer , Integer >> result = new HashMap <>();
51
+ for (int [] edge : edges ) {
52
+ final int from = edge [ 0 ], to = edge [ 1 ], weight = edge [ 2 ];
53
+ final Map < Integer , Integer > weights = result . getOrDefault ( from , new HashMap <>() );
54
+ weights . put ( to , weight );
55
+ result . putIfAbsent ( from , weights );
65
56
}
57
+ return result ;
66
58
}
67
59
68
- private static List <int []> getNeighbours (int [][] grid , int row , int column ) {
69
- final List <int []> result = new ArrayList <>();
70
- for (List <Integer > direction : DIRECTIONS ) {
71
- final int r = row + direction .get (0 ), c = column + direction .get (1 );
72
- if (r >= 0 && r < grid .length && c >= 0 && c < grid [0 ].length && grid [r ][c ] == 1 ) {
73
- result .add (new int [] {r , c });
74
- }
60
+ private static int minTimeRequired (Map <Integer , Integer > distances , int n ) {
61
+ if (distances .size () != n ) {
62
+ return -1 ;
75
63
}
76
- return result ;
64
+ return distances . values (). stream (). max ( Integer :: compareTo ). get () ;
77
65
}
78
66
}
0 commit comments