该题只要能围成一个圈,而且能够通过操作获利就输出yes,不然就输出no
思路也很简单,即通过floyd算法获取个点最大获利,最后比较一下mp[i][i]是否存在大于1的点就行了
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#define N 35
using namespace std;
double mp[N][N],p;//注意一定是浮点数类型
int n,rr;
map < string , int > m;
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
mp[i][j]=mp[j][i]=0;
}
}
bool 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][j]<mp[i][k]*mp[k][j])
mp[i][j]=mp[i][k]*mp[k][j];
}
bool flag=false;
for(int i=1;i<=n;i++)
{
if(mp[i][i]>1)
{
flag=true;
break;
}
}
return flag;
}
int main()
{
char ch1[35],ch2[35];
int ok=1;
while(scanf("%d",&n) && n!=0)
{
init();
m.clear();
for(int i=1;i<=n;i++)
{
scanf("%s",ch1);
m[ch1]=i;
}
scanf("%d",&rr);
for(int i=0;i<rr;i++)
{
scanf("%s %lf %s",ch1,&p,ch2);
int a=m[ch1],b=m[ch2];
mp[a][b]=p;
}
printf("Case %d: ",ok++);
if(floyd()) printf("Yes\n");
else printf("No\n");
}
return 0;
}