当我解决关于 Dijkstra 的问题时,我基本上有两种方式(或 Java 模板)来为 Dijkstra 编写代码,但对于某些问题,问题通过两种方式解决(或 Dijkstra 的 Java 模板)( https://leetcode.com/ questions /network-delay-time/ ) 被接受,并且对于某些(例如, https ://leetcode.com/problems/path-with-minimum-effort/ ),任何人都可以解决这个问题。
对于图(在邻接列表中表示):
ArrayList<int[]>[] graph = new ArrayList[n]; // n represents number of nodes.
1. Dijkstra’s – 一种方式
boolean[] vis = new boolean[n]; int[] dist = new int[n]; Arrays.fill( dist, Integer.MAX_VALUE ); PriorityQueue<Integer> q = new PriorityQueue<>( (a,b) -> dist[a] - dist[b] ); q.add( 0 ); // Starting node dist[start] = 0; while( !q.isEmpty() ) { int node = q.poll(); if( vis[node] ) continue; vis[node] = true; // traversing neighboours for( int[] nb : graph[node] ) { int node2 = nb[0]; int weight = nb[1]; if( !vis[node2] && dist[node2] > dist[node] + weight ) { dist[node2] = dist[node] + weight; q.add( node2 ); } } }
2. Dijkstra’s – 第二种方式
boolean[] vis = new boolean[n]; int[] dist = new int[n]; Arrays.fill( dist, Integer.MAX_VALUE ); PriorityQueue<int[]> q = new PriorityQueue<>( (a,b) -> a[1] - b[1] ); q.add( new int[2] ); // Starting node dist[start] = 0; while( !q.isEmpty() ) { int node = q.peek()[0]; int dis = q.peek()[1]; if( vis[node] ) continue; vis[node] = true; // traversing neighboours for( int[] nb : graph[node] ) { int node2 = nb[0]; int weight = nb[1]; if( !vis[node2] && dist[node2] > dis + weight ) { dist[node2] = dis + weight; q.add( new int[] { node2, dist[node2] } ); } } }
任何人都可以帮助我知道哪种方法是正确的(第一种或第二种)。