zoj 1092 Arbitrage
题目大意是有n个国家之间的汇率,问是否存在从一个国家出发回到该国家后汇率乘积大于一,即套汇。
可以用bellman做,因为是回路,所以要递推n次(多于n次无意义,因为若存在套汇,n次就知道了)。
也可以用floyd算法,最后判断lowdist[ i ][ i ]即可。
#include <stdio.h>
#include <string.h>
int n,m,flag;
double maxdist[50];
char name[50][20],a[20],b[20];
struct exchange
{
int ci;
int cj;
double cij;
}ex[1000];
void bellman(int u)
{
int i,j;
memset(maxdist,0,sizeof(maxdist));
maxdist[u]=1;
for(i=1;i<=n;i++)
{
for(j=0;j<m;j++)
{
if(maxdist[ex[j].cj]<maxdist[ex[j].ci]*ex[j].cij)
maxdist[ex[j].cj]=maxdist[ex[j].ci]*ex[j].cij;
}
}
if(maxdist[u]>1.0)
flag=1;
}
int main()
{
int i,j,k,sum=0;
double x;
while(1)
{
flag=0;
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
scanf("%s",name[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s %lf %s",a,&x,b);
for(j=0;strcmp(a,name[j]);j++);
for(k=0;strcmp(b,name[k]);k++);
ex[i].ci=j;
ex[i].cij=x;
ex[i].cj=k;
}
for(i=0;i<n;i++)
{
bellman(i);
if(flag)
break;
}
sum+=1;
if(flag)
printf("Case %d: Yes\n",sum);
else
printf("Case %d: No\n",sum);
}
return 0;
}

浙公网安备 33010602011771号