Java实现Dijkstra最短路径
算法解析
邻接矩阵类
package TestPackage;
import java.util.ArrayList;
public class Graph {
public ArrayList<String> vertexList;//存储节点
public int [][]edges;//邻接矩阵,用来存储边
public int numofEdges;//边的数目
//初始化矩阵
public Graph(int n) {
vertexList=new ArrayList<String>(n);
edges=new int[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) {edges[i][j]=0;}
else {
edges[i][j]=Integer.MAX_VALUE;
}
}
}
numofEdges=0;
}
//得到节点的个数
public int getNumofVertex() {
return vertexList.size();
}
//得到边的个数
public int getNunofEdges() {
return numofEdges;
}
//返回两个节点之间的权值
public int getWeight(String temp1,String temp2) {
int i=vertexList.indexOf(temp1);
int j=vertexList.indexOf(temp2);
return edges[i][j];
}
//插入节点
public void InsertVertex(String vertex) {
vertexList.add(vertex);
}
//插入边
public void InsertEdge(int v1,int v2,int weight) {
edges[v1][v2]=weight;
edges[v2][v1]=weight;
numofEdges++;
}
public void deleteEdge(int v1,int v2) {
edges[v1][v2]=0;
numofEdges--;
}
}
Dijkstra算法
package TestPackage;
import java.util.ArrayList;
public class Dijkstra {
class Item
{ String endString;
ArrayList<String>lujingArrayList=new ArrayList<String>();
int distance;
}
public void GetShortWay(Graph graph,String startpoint,String endpoint) {
int startindex=graph.vertexList.indexOf(startpoint);
ArrayList<Item>Sarray=new ArrayList<Dijkstra.Item>();//S列表中存已知最短路径的对象,U列表中存未知最短路径的对象
ArrayList<Item>Uarray=new ArrayList<Dijkstra.Item>();//S列表中存已知最短路径的对象,U列表中存未知最短路径的对象
//初始化U列表
for(int i=0;i<graph.getNumofVertex();i++)
{
Item tempItem=new Item();
tempItem.endString=graph.vertexList.get(i);
tempItem.lujingArrayList.add(graph.vertexList.get(startindex));
tempItem.lujingArrayList.add(graph.vertexList.get(i));
tempItem.distance=graph.edges[startindex][i];
Uarray.add(tempItem);
}
while (!Uarray.isEmpty()) {
int t=0;
int tempdistance=Uarray.get(0).distance;
for(int i=0;i<Uarray.size();i++)
{
if(tempdistance>Uarray.get(i).distance)
{
t=i;
tempdistance=Uarray.get(i).distance;
}
}
Sarray.add(Uarray.remove(t));
for(int i=0;i<Uarray.size();i++)
{
int index1=graph.vertexList.indexOf(Uarray.get(i).endString);
for(int j=0;j<Sarray.size();j++)
{
int index2=graph.vertexList.indexOf(Sarray.get(j).lujingArrayList.get(Sarray.get(j).lujingArrayList.size()-1));
if(graph.edges[index1][index2]==Integer.MAX_VALUE)
{
continue;
}
else {
int newdistance=Sarray.get(j).distance+graph.edges[index1][index2];
if(newdistance<Uarray.get(i).distance)
{
Uarray.get(i).distance=newdistance;
Uarray.get(i).lujingArrayList=new ArrayList<String>( Sarray.get(j).lujingArrayList);
Uarray.get(i).lujingArrayList.add(graph.vertexList.get(index1));
}
}
}
}
}
for(int i=0;i<Sarray.size();i++)
{
System.out.print( startpoint+"-->"+Sarray.get(i).endString+"的最短路径为:");
for(int j=0;j<Sarray.get(i).lujingArrayList.size();j++)
{System.out.print( Sarray.get(i).lujingArrayList.get(j)+" ");}
System.out.println("长度为:"+ Sarray.get(i).distance);
}
}
}
主函数
package TestPackage;
public class Program {
public static void main(String[] args)
{
Graph graph=new Graph(3);
graph.InsertVertex("A");
graph.InsertVertex("B");
graph.InsertVertex("C");
graph.InsertEdge(0, 1, 2);
graph.InsertEdge(0, 2, 10);
graph.InsertEdge(1, 0, 2);
graph.InsertEdge(1, 2, 3);
graph.InsertEdge(2, 0, 10);
graph.InsertEdge(2, 1, 3);
Dijkstra cheshiDijkstra=new Dijkstra();
cheshiDijkstra.GetShortWay(graph, "A", "B");
}
}
效果