题目链接:Arbitrage
让这题坑了,精度损失的厉害,用赋值的话,直接全部变成0.00了,无奈下,我只好往里输了,和POJ1860一样找正环,代码也差不多,稍微改改就可以了,但是这个题精度损失的比那个。。。。水过
POJ计划的最短路模块,刷完了,最短路问题,挺坑的,但是就是那点东西,变来变去,就是改改dis[]的更新条件。
明天就要开始POJ的最小生成树了,
ME TI
704Kb 46Ms
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 50;
const int M = 1010;
char a[N][N],s[N];
double dis[N];
int n,m,num;
struct node{
int u,v;
double w;
}edge[M];
int Bellman(int x)
{
dis[x] = 1.0;//开始时漏了,结果都打NO
for(int i = 0;i <n;i++)
{
for(int j = 0;j < num; j++)
{
if(dis[edge[j].v] < dis[edge[j].u] * edge[j].w)
dis[edge[j].v] = dis[edge[j].u] * edge[j].w;
}
}
for(int i = 0;i<num;i++)
{
if(dis[edge[i].v] < dis[edge[i].u]*edge[i].w)
return 1;
}
return 0;
}
int main()
{
int c;
c = 0;
while(scanf("%d",&n),n)
{
c++;
for(int i = 0;i <n;i++)
dis[i] = 0;
for(int i = 0;i <n;i ++)
scanf("%s",a[i]);
scanf("%d",&m);
num = 0;
while(m--)
{
scanf("%s",s);
for(int i = 0;i <n;i++)
{
if(strcmp(s,a[i])== 0)
{
edge[num].u = i;
break;
}
}
scanf("%lf",&edge[num].w);
scanf("%s",s);
for(int i = 0;i <n;i++)
{
if(strcmp(s,a[i]) == 0)
{
edge[num++].v = i;
break;
}
}
}
int st;
for(int i = 0;i<n;i++)//挨个枚举,找正环
{
st = Bellman(i);
if(st)
break;
}
printf("Case %d: ",c);
if(st)
puts("Yes");
else
puts("No");
}
return 0;
}