题意:给一些国家之间的货币交换汇率,问是否可以通过一些货币交换产生盈利
思路:bellman算法判断是否存在正权回路
PS:可能存在相同国家之间的货币交换、此时需要特判一下
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 const int qq=35; 5 char country[qq][qq]; 6 double dis[qq]; 7 int n,m; 8 struct Node 9 { 10 int s,e; 11 double w; 12 }map[qq<<6]; 13 bool bellman() 14 { 15 memset(dis,0,sizeof(dis)); 16 dis[1]=1000.0; 17 for(int j,i=1;i<=n-1;++i) 18 for(j=1;j<=m;++j) 19 if(dis[map[j].e]<dis[map[j].s]*map[j].w) 20 dis[map[j].e]=dis[map[j].s]*map[j].w; 21 for(int j=1;j<=m;++j) 22 if(dis[map[j].e]<dis[map[j].s]*map[j].w) 23 return true; 24 return false; 25 } 26 int main() 27 { 28 int k=1; 29 while(~scanf("%d",&n)&&n){ 30 for(int i=1;i<=n;++i) 31 scanf("%s",country[i]); 32 scanf("%d",&m); 33 int a,b; 34 double c; 35 char s1[qq],s2[qq]; 36 int flag=0; 37 for(int i=1;i<=m;++i){ 38 scanf("%s%lf%s",s1,&c,s2); 39 if(strcmp(s1,s2)==0&&c>1.0){ 40 flag=1; 41 break; 42 } 43 map[i].w=c; 44 for(int j=1;j<=n;++j) 45 if(strcmp(country[j],s1)==0){ 46 map[i].s=j; 47 break; 48 } 49 for(int j=1;j<=n;++j) 50 if(strcmp(country[j],s2)==0){ 51 map[i].e=j; 52 break; 53 } 54 } 55 printf("Case %d: ",k++); 56 if(flag){ 57 printf("Yes "); 58 continue; 59 } 60 if(bellman()) printf("Yes "); 61 else printf("No "); 62 } 63 return 0; 64 }