题意就是要求能否盈利,注意存在自身换自身而且还少换多的情况,直接Floyd过
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<map>
#include<queue>
using namespace std;
int n;
map<string,int>a;
queue<int>q;
double d[35],mp[35][35];
int used[35],cnt[35];
void floyd() //Floyd
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[i][k]*mp[k][j]>mp[i][j])
mp[i][j]=mp[i][k]*mp[k][j];
}
char s[1000],s1[1000];
int main()
{
int m,cas=1;
double r;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
mp[i][i]=1.0; //初始化自身到自身是1
for(int i=1;i<=n;i++)
{
scanf("%s",s);
a[s]=i;
}
scanf("%d",&m);
while(m--)
{
scanf("%s %lf %s",s,&r,s1);
mp[a[s]][a[s1]]=r;
}
int flag=0;
floyd();
for(int i=1;i<=n;i++)
{
if(mp[i][i]>1.0)
{
flag=1;
break;
}
}
if(flag) printf("Case %d: Yes\n",cas++);
else printf("Case %d: No\n",cas++);
}
return 0;
}