您的位置:首页 > 其它

zoj 1092 Arbitrage

2015-01-16 21:02 459 查看
找到这样一个环,使得钱能越变越多

找最长路,d[i][i],正好表示从i出发回到i的最长的路

然后找到这样一个路后判断知否存在大于1的情况

#include <bits/stdc++.h>
using namespace std;
int n;
char as[35][100];
double dd[35][35];
int findd(char k[])
{
for (int i=0;i<n;i++){
if (strcmp(as[i],k)==0) return i;
}
return -1;
}

int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int testcase=1;
while(scanf("%d",&n)!=EOF&&n){
for (int i=0;i<n;i++){
scanf("%s",as[i]);
}
int m;scanf("%d",&m);

memset(dd,0,sizeof(dd));
for (int i=0;i<n;i++){
dd[i][i]=1;
}
for (int i=0;i<m;i++){
char a[100];double b;char c[100];
scanf("%s%lf%s",a,&b,c);
int xx=findd(a);
int yy=findd(c);
dd[xx][yy]=b;
}

for (int k=0;k<n;k++){
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
dd[i][j]=max(dd[i][k]*dd[k][j],dd[i][j]);
}
}
}
int ok=0;
for (int i=0;i<n;i++){
if (dd[i][i]>1){
ok=1;
break;
}
}

if (ok) printf("Case %d: Yes\n",testcase++);
else printf("Case %d: No\n",testcase++);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路