题意:求自身到自身的最大转换率。
思路:如果说这里的汇率不能形成环路无限增加上去,那么一个货币的访问次数不会超过n(货币的种类)。因为最后会形成一种稳定的转换。
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<iostream>
#include<queue>
#define inf 1000000
using namespace std;
map<string,int> mp;
queue<int> que;
int cnt,n;
int vis[50];
double price[50];
struct edge
{
int v,next;
double w;
}p[2000];
int head[100];
void add(int u,int v,double w)
{
p[cnt].v=v;
p[cnt].w=w;
p[cnt].next=head[u];
head[u]=cnt++;
}
bool spfa(int src)
{
int nu[50];
memset(nu,0,sizeof(nu));
memset(vis,0,sizeof(vis));
memset(price,0,sizeof(price));
price[src]=1;
vis[src]=1;
que.push(src);
while(!que.empty())
{
int t=que.front();
que.pop();
vis[t]=0;
for(int i=head[t];i!=-1;i=p[i].next)
{
int v=p[i].v;
double w=p[i].w;
if(price[v]<price[t]*w)
{
nu[v]++;
price[v]=price[t]*w;
if(nu[v]>n) return true;
if(!vis[v])
{
vis[v]=1;
que.push(v);
}
}
}
}
return false;
}
int main()
{
int t,num=1;
string s,s1,s2;
double w;
//freopen("t.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
mp.clear();
if(!n) break;
for(int i=1;i<=n;i++)
{
cin>>s;
mp[s]=i;
}
scanf("%d",&t);
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=t;i++)
{
cin>>s1>>w>>s2;
add(mp[s1],mp[s2],w);
}
if(spfa(1))
printf("Case %d: Yes\n",num);
else
printf("Case %d: No\n",num);
num++;
}
return 0;
}