您的位置:首页 > 其它

poj2240

2015-08-19 18:28 357 查看
链接:点击打开链接

题意:有一些钱的汇率,看是否有一种钱经过兑换能够产生利润

代码;
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
double dis[300][300];
int n,m;
struct node{
char str[500];
}s[500];
int cmp(struct node a,struct node b){
return strcmp(a.str,b.str)<0;
}
int binsearch(char *temp){
int low,high,mid;
low=1;high=n;
while(low<=high){
mid=(low+high)/2;
if(strcmp(s[mid].str,temp)==0)
return mid;
else if(strcmp(s[mid].str,temp)>0)
high=mid-1;
else if(strcmp(s[mid].str,temp)<0)
low=mid+1;
}
}                                   //二分查找字符串位置
void floyd(){
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=max(dis[i][j],dis[i][k]*dis[k][j]);
}                                   //floyd算法模板
int main(){                         //求有向图最大环
char temp[500];
int i,j,a,b,cur,sign;
double c;
cur=1;
while(scanf("%d",&n)!=EOF&&n){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(i==j)
dis[i][j]=1;            //i,j相等时要将dis数组值赋为1
else
dis[i][j]=0;
}
for(i=1;i<=n;i++)
cin>>s[i].str;
sort(s+1,s+n+1,cmp);
scanf("%d",&m);
for(i=0;i<m;i++){
cin>>temp;
a=binsearch(temp);
cin>>c;
cin>>temp;
b=binsearch(temp);
dis[a][b]=c;            //找出a,b位置后赋值
}
floyd();
sign=0;
for(i=1;i<=n;i++)
if(dis[i][i]>1){            //找出换完后大于1的
sign=1;
break;
}
if(sign)
printf("Case %d: Yes\n",cur++);
else
printf("Case %d: No\n",cur++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: