链式前向星
#include<stdio.h> #include<string.h> #define inf 100000 //结构体前向星 //蓝桥oj用C编译不能用typedef struct In{ int e;//终点 int w;//权值 int next;//下一条边的存储位置 }map[200010];// map【】中是边数 int dis[20010],Q[20010]; int vis[20010],head[20010]; void SPFA(int n){ int i,j,front,rear,temp; for(i=1;i<=n;i++){ dis[i]=inf; } dis[1]=0;vis[1]=1; front=0;rear=1; Q[front]=1; while(front<rear){ temp=Q[front++]; vis[temp]=0; j=head[temp]; while(j>0){ if(dis[map[j].e]>map[j].w+dis[temp]){ dis[map[j].e]=map[j].w+dis[temp]; if(!vis[map[j].e]){ Q[rear++]=map[j].e; vis[map[j].e]=1; } } j=map[j].next; } } } int main(){ int n,m,i,j,a,b,val; while(~scanf("%d%d",&n,&m)){ memset(Q,0,sizeof(Q)); memset(head,0,sizeof(head)); memset(vis,0,sizeof(vis)); for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&val); map[i].e=b; map[i].w=val; map[i].next=head[a]; head[a]=i;//head[i]保存的是以i为起点的所有边中编号最大的那个,而把这个当作顶点i的第一条起始边的位置. } SPFA(n); for(i=2;i<=n;i++){ printf("%d\n",dis[i]); } } return 0; }