您的位置:首页 > 其它

ZOJ 1092 Arbitrage (floyd变形)

2010-08-08 13:32 239 查看
给出各种货币的汇率,你可以在各种货币之间转换,看能不能用某种交换方法,能使你最终得到的钱比刚开始得多,当然是同一种货币的时候。

如果平常做最短路径肯定不知道可以用floyd来做,我之前看了一个paper,上面说到,松弛过程中的

d[v] < d[u] + w(v,u)

这里面的加号可以延伸为各种形式的运算的,当时没注意,想到应该没有什么用,碰巧在这道题中floyd也可以变换符号。。挺神奇的,记住记住,以后可能用到。。

#include<stdio.h>
#include<string.h>
int n,i,j,k,edges;
int from,to;
double weight;
int flag,start = 1;
double biao[31][31];
char kindof[31][50];
char t[50];
int find(char *a)
{
int i;
for( i = 1; i <= n; i++ )
if(strcmp(a,kindof[i]) == 0)
return i;
}
int main(void)
{

while( scanf("%d",&n) != EOF && n)
{
for( i = 1; i <= 30; i++ )
for( j = 1; j <= 30 ; j++ )
biao[i][j] = 0;
for( i = 1; i <= 30; i++ )
biao[i][i] = 1;
for( i = 1; i <= n; i++ )
scanf("%s",kindof[i]);

scanf("%d",&edges);
for( i = 1; i <= edges; i++ )
{
scanf("%s",t);
from = find(t);
scanf("%lf%s",&weight,t);
to = find(t);
biao[from][to] = weight;
}

for( k = 1; k <= n; k++ )
for( i = 1; i <= n; i++ )
for( j = 1; j <= n; j++ )
if( biao[i][j] < biao[i][k] * biao[k][j] )
biao[i][j] = biao[i][k] * biao[k][j];

printf("Case %d: ",start++);
for( i = 1, flag = 0; i <= n; i++ )
if( biao[i][i] > 1.0 )
{flag = 1;printf("Yes/n");break;}
if( !flag ) printf("No/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: