POJ2240 Arbitrage(Floyd判负环)

跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int n;
 9 double d[33][33];
10 void Floyd(){
11     for(int k=0; k<n; ++k){
12         for(int i=0; i<n; ++i){
13             for(int j=0; j<n; ++j) d[i][j]=max(d[i][j],d[i][k]*d[k][j]);
14         }
15     }
16 }
17 bool isYes(){
18     for(int i=0; i<n; ++i){
19         if(d[i][i]>1) return 1;
20     }
21     return 0;
22 }
23 int main(){
24     int t=0,m;
25     string name[33],s1,s2;
26     double c;
27     while(cin>>n && n){
28         for(int i=0; i<n; ++i) cin>>name[i];
29         sort(name,name+n);
30         memset(d,0,sizeof(d));
31         cin>>m;
32         while(m--){
33             cin>>s1>>c>>s2;
34             d[lower_bound(name,name+n,s1)-name][lower_bound(name,name+n,s2)-name]=c;
35         }
36         Floyd();
37         if(isYes()) printf("Case %d: Yes\n",++t);
38         else printf("Case %d: No\n",++t);
39     }
40     return 0;
41 }

 

posted @ 2016-01-01 15:43  WABoss  阅读(740)  评论(0编辑  收藏  举报