1 http://poj.org/problem?id=2983 2 判断是否存在负权回路,差分约束条件 有 3 A 到B的距离一定是 X 4 所以要 表示出来就是 insert(A,B,-x); 5 insert(B,A,x); 6 #include<stdio.h> 7 #include<vector> 8 #include<iostream> 9 #include<queue> 10 #include<string.h> 11 using namespace std; 12 const int N=2000; 13 int n; 14 struct node 15 { 16 17 int y; 18 int w; 19 }; 20 vector<node>p[N]; 21 queue<int>Q; 22 int vis[N],dis[N],time[N]; 23 void init() 24 { 25 memset(vis,0,sizeof(vis)); 26 memset(time,0,sizeof(time)); 27 28 for(int i=0;i<=n;i++){dis[i]=999999;} 29 dis[0]=0; 30 vis[0]=1; 31 time[0]=1; 32 } 33 void insert(int x,int y,int z) 34 { 35 node q; 36 q.y=y; 37 q.w=z; 38 p[x].push_back(q); 39 } 40 int spfa(int x) 41 { 42 init(); 43 while(!Q.empty())Q.pop(); 44 Q.push(0); 45 while(!Q.empty()) 46 { 47 48 int k=Q.front(); 49 Q.pop(); 50 vis[k]=0;//出来之后还可能再进 51 52 for(int i=0;i<p[k].size();i++) 53 { 54 int a=p[k][i].y; 55 int len=p[k][i].w; 56 if(dis[a]>dis[k]+len) 57 { 58 59 dis[a]=dis[k]+len; 60 61 if(!vis[a]) 62 { 63 Q.push(a); 64 vis[a]=1; 65 time[a]++; 66 if(time[a]>n)return 0; 67 } 68 } 69 } 70 } 71 return 1; 72 73 74 } 75 int main() 76 { 77 int i,x,y,z,m; 78 char str[3]; 79 while(~scanf("%d%d",&n,&m)) 80 { 81 getchar(); 82 for(i=0;i<=N;i++)p[i].clear(); 83 84 for(i=0;i<m;i++) 85 { 86 scanf("%s",str); 87 if(str[0]=='P') 88 { 89 scanf("%d%d%d",&x,&y,&z); 90 insert(x,y,-z); 91 insert(y,x,z); 92 } 93 else 94 { 95 scanf("%d%d",&x,&y); 96 insert(x,y,-1); 97 } 98 99 100 } 101 for(i=1;i<=n;i++) 102 { 103 insert(0,i,0); 104 } 105 int f; 106 f=spfa(0); 107 108 109 110 if(f)printf("Reliable\n"); 111 else printf("Unreliable\n"); 112 113 } 114 }