链式前向星
#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;
}