Dijkstra算法类似prim算法,属于贪心算法。可以看prim这篇博客,原理是一样的。
c++代码实现:
数组表示
#include <bits/stdc++.h>
#define V 9
using namespace std;
//打印指定顶点到其他顶点的距离
int minDist(int *dist,int *set)
{
int index,min = INT_MAX;
for(int k = 0; k < V; k++)
{
if(!set[k] && min > dist[k])
{
index = k;
min = dist[k];
}
}
return index;
}
void printV(int *dist)
{
for(int i = 0; i < V; i++)
cout << i << " " << dist[i] << endl;
}
void dijkstra(int graph[V][V],int src)
{
int dist[V];//存储最短距离
int set[V];
for(int i = 0; i < V; i++)
{
dist[i] = INT_MAX;
set[i] = false;
}
dist[src] = 0;
for(int i = 0; i < V-1; i++)
{
int idx = minDist(dist,set);
set[idx] = true;
for(int k = 0; k < V; k++)
if(graph[idx][k] && !set[k] && dist[k] > graph[idx][k] + dist[idx] && dist[idx] != INT_MAX)
dist[k] = dist[idx]+graph[idx][k];
}
printV(dist);
}
int main(void)
{
int graph[V][V] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},
{4, 0, 8, 0, 0, 0, 0, 11, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 7, 0, 9, 14, 0, 0, 0},
{0, 0, 0, 9, 0, 10, 0, 0, 0},
{0, 0, 4, 14, 10, 0, 2, 0, 0},
{0, 0, 0, 0, 0, 2, 0, 1, 6},
{8, 11, 0, 0, 0, 0, 1, 0, 7},
{0, 0, 2, 0, 0, 0, 6, 7, 0}
};
dijkstra(graph,0);
return 0;
}