您的位置:首页 > 其它

有向图单源最短路径Dijkstra算法(高配版)

2016-12-22 00:03 204 查看
这是Dijkstra算法的高配版

(╯▔皿▔)╯其实就是可以打印出来所走的路径啦~

找图上的某个点到其余点的最短路径

Dijkstra算法的思想:

1.将所有的点分为两种,走过的点和没走过的点

    首先,原点标记为走过的第一个点,没走过的点的距离值为正无穷

               看原点可以走到哪些点,将这些点的前驱改为原点

2.找到下一个可以作为原点的点:

   在没走过的点中找到当前路径最短的点作为下一个原点

   从这个原点看能走到哪些点并且比较

        当前原点距离值加上原点到那个点的距离值与那个点的距离值作比较,如果要小于则替换那个点的距离值为原点距离值到当前点距离值之和

        那个点的前驱改为当前原点

3.重复2的步骤直到所有的点都走过了

package GraphHomework;
import java.util.ArrayList;
public class GraphHomework {
public void Dijkstrate(int [][] r,int [][] w,int n,int k)
{
// r数组用来储存邻接矩阵,w数组用来储存距离,n是节点的个数,用来建立相应数组的大小,k是从第几个节点开始。
int[] v=new int
;//顶点的数组
int[] pre=new int
;//储存前驱
boolean gone[]=new boolean
;//用来储存当前节点是否已经走过了
//初始化
for(int i=0;i<n;i++)
{
v[i]=Integer.MAX_VALUE;
pre[i]=0;
gone[i]=false;
}
v[k]=0;
int current=k;//从V1开始
boolean have=true;
while(have)
{
int j=0;
while(j<n)
{
if(r[current][j]==1)//当前节点是否能够走到第j个节点
//当前节点到第j个节点的距离是否小于经过其他节点到第j个节点的距离
if((v[current]+w[current][j])<v[j])
{
v[j]=v[current]+w[current][j];
pre[j]=current;
}
j++;
}
gone[current]=true;
/*
* 用来选择下一个应该到的节点
* 具体的方法是:从没有走过的点中找到v[j]值最小的那个点作为下一个应该访问的节点
*/
int min=Integer.MAX_VALUE;
for(j=0;j<n;j++)
{
if(gone[j]==false&&v[j]<=min)
{
current=j;
min=v[j];
}
}
/*
* 作为所有节点是否都遍历完了的判断
*/
have=false;
for(j=0;j<n;j++)
if(gone[j]==false)
{
have=true;
break;
}
}
for(int i=0;i<n;i++)
{
if(i!=k)
{
System.out.println("第"+(k+1)+"节点到第"+(i+1)+"节点的最短路径是:"+v[i]);
int j=i;
ArrayList<Integer> a=new ArrayList<Integer>();
a.add(j);
while(j!=k)
{
j=pre[j];
a.add(j);
}
System.out.print("所走的路径是:");
for(int m=a.size()-1;m>0;m--)
System.out.print((a.get(m)+1)+"->");
System.out.print((a.get(0)+1));
System.out.println();
}
}

}
}
public class Matrix {
public static void main(String[] args)
{
int n=7;//节点数
int [][] road=new int

;
int [][] w=new int

;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
road[i][j]=0;
w[i][j]=0;
}
}
road[0][1]=1;road[0][3]=1;
road[1][3]=1;road[1][4]=1;
road[2][0]=1;road[2][5]=1;
road[3][2]=1;road[3][4]=1;road[3][5]=1;road[3][6]=1;
road[4][6]=1;
road[6][5]=1;
w[0][1]=2;w[0][3]=1;
w[1][3]=3;w[1
9de2
][4]=10;
w[2][0]=4;w[2][5]=5;
w[3][2]=2;w[3][4]=2;w[3][5]=8;w[3][6]=4;
w[4][6]=6;
w[6][5]=1;
GraphHomework graph=new GraphHomework();
graph.Dijkstrate(road, w, n, 0);
}
}
运行结果:
第1节点到第2节点的最短路径是:2

所走的路径是:1->2

第1节点到第3节点的最短路径是:3

所走的路径是:1->4->3

第1节点到第4节点的最短路径是:1

所走的路径是:1->4

第1节点到第5节点的最短路径是:3

所走的路径是:1->4->5

第1节点到第6节点的最短路径是:6

所走的路径是:1->4->7->6

第1节点到第7节点的最短路径是:5

所走的路径是:1->4->7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: