http://http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=92
题目意思:主要就是:给你一组国家和国家间的部分货币汇率兑换表,问你是否存在一种方式,从一种货币出发,经过一系列的货币兑换,最后返回该货币时大于出发时的数值?如果大于则“Yes”,否则“No”。。
具体思路:因为求最终的数值问题!所以就可以根据转化,得知这就是把最短路问题转化一下!为什么?你看,每个国家的钱可以有一定的转化关系,最终必须回到本身的,(就是本身通过与别国的货币交换,如大于交换前就“Yes”,,,,)。。
因此可以把各国的转化成点,而每次的转化就相当于与各国之间的距离!!因此得解。。
具体见代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m;
double dis[35][35];
char str[35][22];
char s1[22],s2[22];
int getsID(char s[])
{
int i;
for(i=1;i<=n;i++)
{
if(strcmp(str[i],s)==0)
{
return i;
}
}
}
void flody()
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(dis[i][k]*dis[k][j]>dis[i][j])
{
dis[i][j]=dis[i][k]*dis[k][j];
}
}
}
}
}
int main()
{
int i,j,t=0;
while(scanf("%d",&n)==1&&n)
{
for(i=1;i<=n;dis[i][i]=1,i++)
for(j=1;j<=n;j++)
{
dis[i][j]=0;
}
for(i=1;i<=n;i++)
{
scanf("%s",&str[i]);
}
scanf("%d",&m);
double w;
while(m--)
{
scanf("%s %lf %s",s1,&w,s2);
i=getsID(s1);//将其化为数字,即每点之间的距离!!
j=getsID(s2);
dis[i][j]=w;
}
flody();
int flag=0;
for(i=1;i<=n;i++)
{
if(dis[i][i]>1)
{
flag=1;break;
}
}
printf("Case %d: ",++t);//注意空格!!
if(flag){printf("Yes\n");}
else
printf("No\n");
}
return 0;
}