poj 2240 Arbitrage (Floyd)
2014-07-24 14:43
351 查看
链接:poj 2240
题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率。
如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound。
问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币可以使货币量增加。
思路:本题其实是Floyd的变形。将变换率作为构成图的路径的权值。不过构成的图是一个有向图。
最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j])。
题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率。
如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound。
问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币可以使货币量增加。
思路:本题其实是Floyd的变形。将变换率作为构成图的路径的权值。不过构成的图是一个有向图。
最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j])。
#include<stdio.h> #include<string.h> int main() { int n,m,i,j,k,l,r,t=0; char s[35][30],s1[30],s2[30]; double a[35][35],c; while(scanf("%d",&n)!=EOF){ if(n==0) break; t++; memset(a,0,sizeof(a)); //开始都初始化为0了,而不是无穷大,当然可以初始化为无穷小 for(i=1;i<=n;i++){ scanf("%s",s[i]); a[i][i]=1.0; //自己的税率初始化为1 } scanf("%d",&m); while(m--){ scanf("%s%lf%s",s1,&c,s2); l=r=0; for(i=1;i<=n;i++){ if(strcmp(s1,s[i])==0) //存在自己对自己的兑换率,所有两个字符串可能相等 l=i; if(strcmp(s2,s[i])==0) //之前因为加了 else 将上述情况排除了,一直wa r=i; if(l&&r) break; } a[l][r]=c; } for(k=1;k<=n;k++) //Floyd算法 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i][k]*a[k][j]>a[i][j]) //松弛条件 a[i][j]=a[i][k]*a[k][j]; k=0; for(i=1;i<=n;i++) if(a[i][i]>1){ k=1; break; } if(k) printf("Case %d: Yes\n",t); else printf("Case %d: No\n",t); } return 0; }
相关文章推荐
- POJ 2240 Arbitrage (floyd变形)
- POJ 2240 Arbitrage 简单变形的Floyd
- poj 2240 Arbitrage 【最短路&&floyd】
- poj2240 Arbitrage 图论,Floyd变形
- poj 2240 Arbitrage(Floyd最短路)
- POJ 2240 Arbitrage(最短路,floyd)
- POJ 2240 Arbitrage(floyd)
- POJ - 2240 Arbitrage(Floyd)
- hdu 1217/poj 2240 Arbitrage【floyd】
- POJ 2240 && HDU 1217 Arbitrage(Floyd)
- poj 2240 Floyd判断有向图负环(arbitrage)
- POJ 2240 Arbitrage(最短路 Floyd)
- POJ -- 2240 Arbitrage (Floyd‘)
- POJ-2240 Arbitrage(floyd详解)
- POJ ~ 2240 ~ Arbitrage (Floyd或BellmanFord)
- poj-2240 Arbitrage(最佳路径 Floyd-Warshall算法)
- POJ 2240 Arbitrage( floyd)
- 最短路练习9/poj/2240 Arbitrage;正环:floyd或spfa解法;
- POJ 2240 Arbitrage (Floyd)
- POJ 2240 Arbitrage (Floyd最短路变形)