一个源点到其余各个顶点的最短路程,叫做“单源最短路”。
时间复杂度O((M+N)logN),不能解决负权问题。
(为了照顾只会c的朋友们,我就用c语言实现这个代码)
#include<stdio.h>
int main()
{
int n,m,x,y,d,u;
scanf("%d%d",&n,&m);
int dis[n+1]={0};
int s[n+1][n+1]={0},book[n+1]={0};
//读入边
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&d);
s[x][y]=d;
}
//初始化到源点的最短距离
for(int i=1;i<=n;i++){
if(s[1][i]!=0) dis[i]=s[1][i];
else dis[i]=99999;
}
dis[1]=0;
book[1]=1;//标记初始位置
//算法核心
for(int i=1;i<n;i++){
int min=99999;
//找到距离初始位置的最近的位置
for(int j=1;j<=n;j++){
if(min>dis[j]&&book[j]==0&&dis[j]!=0){
min=dis[j];
u=j;
}
}
book[u]=1;
for(int k=0;k<=n;k++){
if(s[u][k]!=0){
if(dis[k]>dis[u]+s[u][k])
dis[k]=dis[u]+s[u][k];
}
}
}
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
/*输入
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4*/
/*输出:0 1 8 4 13 17*/
}