算法
@org.junit.Test
public void testDijkstra() {
int[][] adj = {
{0, 2, INF, 1, INF, INF, INF},
{INF, 0, INF, 3, 10, INF, INF},
{4, INF, 0, INF, INF, 5, INF},
{INF, INF, 2, 0, 2, 8, 4},
{INF, INF, INF, INF, 0, INF, 6},
{INF, INF, INF, INF, INF, 0, INF},
{INF, INF, INF, INF, INF, 1, 0},
};
dijkstra(adj);
}
public void dijkstra(int[][] adjMatrix) {
//节点数
int count = adjMatrix[0].length;
//初始节点定为0
int cur = 0;
//dist[index]表示 节点index 借助 集合U 到达顶点的最小距离
int[] dist = new int[count];
//集合U初始化只包含初始节点
for (int i = 0; i < count; i++) {
dist[i] = adjMatrix[cur][i];
}
boolean[] visit = new boolean[count];
visit[cur] = true;
System.out.println("vertex->" + cur);
for (int i = 1; i < count; i++) {//找节点的次数
int nearBy = 0;
int dis = INF;
//每次找通过集合U到顶点的距离最短的未访问节点
for (int j = 0; j < count; j++) {
if (!visit[j] && dist[j] < dis) {
nearBy = j;
dis = dist[j];
}
}
if (dis == INF){
return ;
}
visit[nearBy] = true;
System.out.println("vertex->" + nearBy);
//更新其他未访问节点通过集合U到顶点的距离(集合U增加了nearBy节点)
for (int j = 0; j < count; j++) {
if (!visit[j] && adjMatrix[nearBy][j]!=INF && dist[j] > dist[nearBy] + adjMatrix[nearBy][j]) {
dist[j] = dist[nearBy] + adjMatrix[nearBy][j];
}
}
}
}
结果
Dijkstra
及和Prim
算法区别
这里引用一个百度知道的回答:
在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。
二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那么二者是否等价呢?
也就是说是否Dijkstra也可以计算出最小生成树而Prim也可以计算出从第一个顶点v0到其他点的最短路径呢?答案是否定的,否则就不必有两个算法了。
二者的不同之处在于“权值最低”的定义不同,Prim的“权值最低”是相对于U中的任意一点而言的,也就是把U中的点看成一个整体,每次寻找V-U中跟U的距离最小(也就是跟U中任意一点的距离最小)的一点加入U;而Dijkstra的“权值最低”是相对于v0而言的,也就是每次寻找V-U中跟v0的距离最小的一点加入U。