您的位置:首页 > 其它

图的最短路径-Dijkstra算法

2018-01-21 00:00 113 查看
/**
* 统计最短路径的算法
* Dijkstra.统计图中顶点v到其他各顶点的最短路径
*
* @param vs   起始顶点,即计算顶点vs到其他顶点的最短路径
* @param prev 前驱顶点数组,即prev[i]的值是顶点vs到顶点i的最短路径所经历的全部顶点中,位于顶点i之前的那个顶点
* @param dist 长度数组,即dist[i]是顶点vs到顶点i的最短路径长度
*/
public void dijkstra(int vs, int[] prev, int[] dist) {
//flag[i]=true表示顶点vs到顶点i的最短路径已成功获取
boolean[] flag = new boolean[mVexs.length];
//初始化
for (int i = 0; i < mVexs.length; i++) {
flag[i] = false;
prev[i] = 0;
dist[i] = getWeight(vs, i);
}

//对顶点vs自身进行初始化
flag[vs] = true;
dist[vs] = 0;
int k = 0;

for (int i = 1; i < mVexs.length; i++) {
/**
* 寻找最小的路径,即在未获取路径的顶点中,寻找离vs最近的顶点k
*/
int min = INF;
for (int j = 0; j < mVexs.length; j++) {
if (flag[j] == false && dist[j] < min) {
min = dist[j];
k = j;

}
}
//标记k为已获取到最短路径
flag[k] = true;

for(int j=0;j<mVexs.length;j++){
int tmp = getWeight(k,j);
tmp = (tmp==INF?INF:(tmp+min));
if(flag[j]==false&&tmp<dist[j]){
dist[j]=tmp;
prev[j]=k;

}
}
}

//打印dijkstara最短路径的结果
System.out.println("dijkstra:"+mVexs[vs].data);
for(int i=0;i<mVexs.length;i++){
System.out.println(mVexs[vs].data+"->"+mVexs[i].data+" : "+dist[i]);
}

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