#include<stdio.h>//求源点到所有顶点的最短路径
const int EDGE=100,VEX=100,inf=99999999;//边数,点数
int u[EDGE],v[EDGE],w[EDGE];//u,v,w记录边的信息
int first[VEX],next[EDGE],book[VEX],dis[VEX];//first存储每个顶点的第一条边的编号,next存储编号为i的边的下一条边的编号
int main(){
int n,m,point;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
dis[i]=inf;
for(int i=0;i<n;i++)
first[i]=-1;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]-1];
first[u[i]-1]=i;
}
book[0]=1;//标记源点
int origin=first[0];
while(origin!=-1){
int vnode=v[origin];
dis[vnode-1]=w[origin];
origin=next[origin];
}//源点到其余顶点的初始路程
for(int i=0;i<n-1;i++){
int min=inf;
for(int j=0;j<n;j++){
if(book[j]==0&&dis[j]<min){
min=dis[j];
point=j;
}
}//离源点最近的顶点
book[point]=1;
origin=first[point];
while(origin!=-1){
if(dis[v[origin]-1]>dis[point]+w[origin])
dis[v[origin]-1]=dis[point]+w[origin];
origin=next[origin];
}//松弛源点到各顶点的路程
}
for(int i=0;i<n;i++)
printf("%d ",dis[i]);
}
Dijkstra
最新推荐文章于 2024-09-27 07:22:30 发布