【Dijkstra使用PriorityQueue的Java中最短路径算法】给定一个带有邻接表表示节点之间边缘的图形, 任务是实现Dijkstra的算法对于单源最短路径使用优先队列在Java中。
给定一个图和图中的一个源顶点, 找到从源到给定图中所有顶点的最短路径。
Input : Source = 0Output : VertexDistance from Source00142123194215116978814
我们已经讨论了Dijkstra最短的Path实现, 例如Dijkstra的邻接矩阵表示算法(时间复杂度为O(v2)
以下是Dijkstra算法使用优先级队列的Java实现:
//Java implementation of Dijkstra's Algorithm
//using Priority Queue
import java.util.*;
public class DPQ {
private int dist[];
private Set<
Integer>
settled;
private PriorityQueue<
Node>
pq;
private int V;
//Number of vertices
List<
List<
Node>
>
adj;
public DPQ( int V)
{
this .V = V;
dist = new int [V];
settled = new HashSet<
Integer>
();
pq = new PriorityQueue<
Node>
(V, new Node());
}//Function for Dijkstra's Algorithm
public void dijkstra(List<
List<
Node>
>
adj, int src)
{
this .adj = adj;
for ( int i = 0 ;
i <
V;
i++)
dist[i] = Integer.MAX_VALUE;
//Add source node to the priority queue
pq.add( new Node(src, 0 ));
//Distance to the source is 0
dist[src] = 0 ;
while (settled.size() != V) {//remove the minimum distance node
//from the priority queue
int u = pq.remove().node;
//adding the node whose distance is
//finalized
settled.add(u);
e_Neighbours(u);
}
}//Function to process all the neighbours
//of the passed node
private void e_Neighbours( int u)
{
int edgeDistance = - 1 ;
int newDistance = - 1 ;
//All the neighbors of v
for ( int i = 0 ;
i <
adj.get(u).size();
i++) {
Node v = adj.get(u).get(i);
//If current node hasn't already been processed
if (!settled.contains(v.node)) {
edgeDistance = v.cost;
newDistance = dist[u] + edgeDistance;
//If new distance is cheaper in cost
if (newDistance <
dist[v.node])
dist[v.node] = newDistance;
//Add the current node to the queue
pq.add( new Node(v.node, dist[v.node]));
}
}
}//Driver code
public static void main(String arg[])
{
int V = 5 ;
int source = 0 ;
//Adjacency list representation of the
//connected edges
List<
List<
Node>
>
adj = new ArrayList<
List<
Node>
>
();
//Initialize list for every node
for ( int i = 0 ;
i <
V;
i++) {
List<
Node>
item = new ArrayList<
Node>
();
adj.add(item);
}//Inputs for the DPQ graph
adj.get( 0 ).add( new Node( 1 , 9 ));
adj.get( 0 ).add( new Node( 2 , 6 ));
adj.get( 0 ).add( new Node( 3 , 5 ));
adj.get( 0 ).add( new Node( 4 , 3 ));
adj.get( 2 ).add( new Node( 1 , 2 ));
adj.get( 2 ).add( new Node( 3 , 4 ));
//Calculate the single source shortest path
DPQ dpq = new DPQ(V);
dpq.dijkstra(adj, source);
//Print the shortest path to all the nodes
//from the source node
System.out.println( "The shorted path from node :" );
for ( int i = 0 ;
i <
dpq.dist.length;
i++)
System.out.println(source + " to " + i + " is "
+ dpq.dist[i]);
}
}//Class to represent a node in the graph
class Node implements Comparator<
Node>
{
public int node;
public int cost;
public Node()
{
}public Node( int node, int cost)
{
this .node = node;
this .cost = cost;
}@Override
public int compare(Node node1, Node node2)
{
if (node1.cost <
node2.cost)
return - 1 ;
if (node1.cost>
node2.cost)
return 1 ;
return 0 ;
}
}
输出如下:
The shorted path from node :0 to 0 is 00 to 1 is 80 to 2 is 60 to 3 is 50 to 4 is 3
推荐阅读
- 缓存设计的概念详细介绍
- win7旗舰版硬盘安装图文详细教程
- xp系统64位与32位的区别在啥地方
- winpe u盘版安装win8系统图文详细教程
- win7联想旗舰版64位系统重装图文详细教程
- 技术联盟win7专业版64位原版系统下载
- 安装系统 win8重装系统win7图文详细教程
- sony iso系统重装图文详细教程
- acer windows7 32系统下载