1.定义
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
2.算法描述
1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
3.参考代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x7fffffff;
const int N = 1024; //结点最大数量
int edge[N][N]; //存储图
bool visited[N]; //记录结点是否用于搜索过
int dis[N]; //各结点到源结点的最短距离
void init(int n){
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(i == j) {
edge[i][j] = 0;
}
else{
edge[i][j] = inf;
}
}
dis[i] = inf;
}
memset(visited, false, sizeof(visited));
}
void dijkstra(int source,int n) {
int num = source;
int Min = inf;
visited[num] = true;
for(int i = 1; i <= n; i++) {
dis[i] = min(dis[i],edge[num][i]);
}
for(int i = 1; i<= n-1; i++) {
int Min = inf;
for(int j = 1; j<=n; j++) {
if(visited[j] == false && dis[j] < Min) {
Min = dis[j];
num = j;
}
}
visited[num] = true;
for(int k = 1; k <= n; k++) {
if(edge[num][k] < inf) {
if(visited[k] == false && dis[k] > dis[num] + edge[num][k]){
dis[k] = dis[num] + edge[num][k];
}
}
}
}
}
int main() {
int n,m,source;
scanf("%d%d", &n, &m); //输入结点数和边数
scanf("%d", &source); //输入源结点
init(n);
for(int i = 1; i <= m; i++) {
int Start, End, Distance;
scanf("%d%d%d",&Start, &End, &Distance);
edge[Start][End] = Distance;
}
dijkstra(source,n);
for(int i = 1; i <= n; i++) {
if(i != source)
printf("%d-->%d %d
", source, i, dis[i]);
}
return 0;
}