POJ-2240 Floyd的变化..

原本想再接再励做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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值