
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<iostream> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 #define N 200000+5 9 const int inf=0x3f3f3f3f; 10 struct node{ 11 int u,v,nest,w; 12 }e[N]; //结点;; 13 int head[N],dis[N],vis[N]; 14 int n,m,cnt; 15 16 void add(int u,int v,int w) //就是往邻接表中添加一条从u到v权值为w的边; 17 { 18 e[cnt].u=u; 19 e[cnt].v=v; 20 e[cnt].w=w; 21 e[cnt].nest=head[u]; 22 head[u]=cnt++; 23 } 24 25 void spfa() 26 { 27 int i,u,v,w; 28 queue<int>q; 29 for(i=1;i<=n;i++) 30 { 31 dis[i]=inf; vis[i]=0; 32 } 33 dis[1]=0; 34 vis[1]=1; 35 q.push(1); 36 while(!q.empty()) 37 { 38 u=q.front(); 39 q.pop(); 40 vis[u]=0; 41 for(i=head[u];i!=-1;i=e[i].nest) 42 { 43 v=e[i].v; 44 w=e[i].w; 45 if(dis[v]>dis[u]+w) 46 { 47 dis[v]=dis[u]+w; 48 if(!vis[v]) 49 { 50 vis[v]=1; 51 q.push(v); 52 } 53 } 54 } 55 } 56 } 57 58 int main() 59 { 60 int i,u,v,w; 61 while(~scanf("%d%d",&n,&m)) 62 { 63 cnt=0; 64 memset(head,-1,sizeof(head)); 65 for(i=0;i<m;i++) 66 { 67 scanf("%d%d%d",&u,&v,&w); 68 add(u,v,w); 69 } 70 spfa(); 71 for(i=2;i<=n;i++) 72 printf("%d ",dis[i]); 73 74 } 75 return 0; 76 }