1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int inf=1<<29; 6 const int N=1001; 7 int w[N][N],d[N]; 8 int u,v,c,m,n,k; 9 struct node 10 { 11 int from; 12 int to; 13 int c; 14 }e[N*N]; 15 bool Bellman_ford(int st) 16 { 17 for(int i=1;i<=n;i++) 18 { 19 d[i]=inf; 20 } 21 d[st]=0; 22 for(int i=1;i<n;i++) 23 { 24 for(int j=0;j<=2*m;j++) 25 { 26 if(d[e[j].to]>d[e[j].from]+e[j].c) 27 { 28 d[e[j].to]=d[e[j].from]+e[j].c; 29 //更新的是该点到起点的距离d[*],则其他通过(该点)的点回到起点的距离也有可能会被更新 30 //所以要循环n-1次,保证所有边都能够更新完,(若每次循环都只更新一条边,就会更新n-1次); 31 }//与dij比较,更新后没有标记,可以持续更新; 32 33 } 34 } 35 for(int i=0;i<2*m;i++)//如果持续更新,则存在负权环,抛出错误(如果是无向图,回路中只要存在一个负值,就会形成负权环) 36 if(d[e[i].to]>d[e[i].from]+e[i].c) 37 return true; 38 return false; 39 } 40 int main() 41 { 42 while(scanf("%d%d",&n,&m)!=EOF) 43 { 44 for(int i=0;i<2*m;i+=2)//人为付成无向图 45 { 46 scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].c); 47 e[i+1].from=e[i].to; 48 e[i+1].to=e[i].from; 49 e[i+1].c=e[i].c; 50 } 51 scanf("%d",&k); 52 if(Bellman_ford(k)) 53 printf("-1 "); 54 else 55 { 56 for(int i=2;i<=n;i++) 57 printf("%d %d ",i,d[i]); 58 } 59 } 60 return 0; 61 }