#include <iostream>
#include <stdio.h>
#include <map>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <string>
using namespace std;
#define pii pair<int,double>
#define X first
#define Y second
const int N=40;
map<string,int>e;
vector<pii>g[N];
int vis[N];
double dis[N];
int n;
int cnt[N];
void init()
{
memset(vis,false,sizeof vis);
memset(dis,0,sizeof dis);
memset(cnt,0,sizeof cnt);
}
int spfa(int root)
{
init();
queue<int>que;
while(!que.empty())
que.pop();
vis[root]=true;
dis[root]=1000;
cnt[root]=1;
que.push(root);
while(!que.empty())
{
int u=que.front();
que.pop();
vis[u]=false;
for(int i=0; i<g[u].size(); i++)
{
int v=g[u][i].X;
double w=g[u][i].Y;
if(dis[v]<dis[u]*w)
{
dis[v]=dis[u]*w;
if(!vis[v])
{
vis[v]=true;
que.push(v);
}
cnt[v]++;
if(cnt[v]>=n)
return 1;
}
}
}
return 0;
}
int main()
{
int m,casee=1;
while(~scanf("%d",&n))
{
if(n==0)
break;
for(int i=1; i<=n; i++)
g[i].clear();
e.clear();
for(int i=1; i<=n; i++)
{
string name1;
cin>>name1;
e[name1]=i;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
{
string name1,name2;
double val;
cin>>name1>>val>>name2;
g[e[name1]].push_back(pii(e[name2],val));
}
int flag=0;
for(int i=1; i<=n; i++){
if(spfa(i)){
printf("Case %d: Yes\n",casee++);
flag=1;
break;
}
}
if(!flag)
printf("Case %d: No\n",casee++);
}
return 0;
}
【POJ 2240】Arbitrage【spfa判正环】
最新推荐文章于 2021-11-19 18:16:00 发布