#include <stdio.h> #include <string.h> #include <math.h> #include <stdbool.h> #define maxedge 20000 #define maxn 5000 //结点数 #define inf 1<<28 bool vist[maxn]; struct Edge { int s; //边的起点 int t; //边的终点 int next;//当前下一条边的编号 int w; //边的权值 }edge[maxedge]; int headlist[maxedge]; //索引 head[i]存放已i为起点的“第一条”边 int distance[maxn]; int n,m,x; void dij() { int i,j,k; memset(vist,false,sizeof(vist)); for(i=1;i<=n;++i) distance[i]=inf; distance[x]=0; for(i=1;i<=n;i++) { k=-1; for(j=1;j<=n;j++) if(!vist[j]&&(k==-1||distance[k]>distance[j])) k=j; vist[k]=true; for(j=headlist[k];j!=-1;j=edge[j].next) if(!vist[edge[j].t]&&(distance[k]+edge[j].w<distance[edge[j].t])) distance[edge[j].t]=distance[k]+edge[j].w; } for(i=1;i<=n;i++) printf("%d ",distance[i]); } int main() { int i,a,b,c; while(~scanf("%d%d%d",&n,&m,&x)) { for(i=1;i<=n;++i) headlist[i]=-1; for(i=1;i<=m;++i) { scanf("%d%d%d",&a,&b,&c); edge[i].s=a; edge[i].t=b; edge[i].w=c; edge[i].next=headlist[a];//索引:节点i 后一条边编号为headlist[a]; headlist[a]=i; } dij(); } return 0; }
时间: 2024-10-29 19:11:50