原本想再接再励做SPFA的....搜到这题~~结果用Floyd水掉了...题目的意思是说国家国家之间的货币有不同的汇率~~问有没有可能让钱从一个国家开始经过一系列国家汇率转换..最终回到手中钱变多了...
Floyd在更新的时候改一下..因为要钱越多越好~~所以就不是取最小值~~而是最大值~~并且在更新时~~线段与枚举的中心点不是相加而是相乘...最后判断 mar[ i ] [ i ] 中有无大于1的..
还有初始化的时候..mar [ i ][ i ] 自己到自己的初始化为1.... 其他的初始化为一个负数就可以了~~
Program:
#include<iostream> #include<algorithm> #include<map> #include<stdio.h> #include<string.h> using namespace std; map<string,int> mymap; string a[40]; char s[1001]; int n,m,i,j,t; double mar[40][40]; bool Floyd() { int i,j,k; for (k=1;k<=n;k++) for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (mar[i][j]<mar[i][k]*mar[k][j]) mar[i][j]=mar[i][k]*mar[k][j]; for (i=1;i<=n;i++) if (mar[i][i]-1>0.0001) return true; return false; } int main() { t=0; while (~scanf("%d",&n)) { if (!n) break; mymap.clear(); for (i=1;i<=n;i++) { scanf("%s",s); a[i]=s; mymap[a[i]]=i; } scanf("%d",&m); for (i=1;i<=n;i++) for (j=1;j<=n;j++) mar[i][j]=-1000000; for (i=1;i<=n;i++) mar[i][i]=1; for (i=1;i<=m;i++) { int x,y; double k; scanf("%s",s); a[0]=s; x=mymap[a[0]]; scanf("%lf",&k); scanf("%s",s); a[0]=s; y=mymap[a[0]]; mar[x][y]=k; } t++; printf("Case %d: ",t); if (Floyd()) printf("Yes\n"); else printf("No\n"); } return 0; }