题意:给你m种货币,给你m种货币兑换规则,问通过这些规则最后能不能盈利。eg:1美元换0.5英镑,1英镑换10法郎,1法郎换0.21美元,这样1美元能换0.5*10*0.21=1.05美元,净赚0.05美元。
思路:spfa判变大环。
#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#include<map>
using namespace std;
map<string,int> mp;
int tot=0,vis[105];
double g[105][105],dis[105];
bool spfa(int sta)
{
queue<int> q;
memset(dis,0,sizeof(dis));
q.push(1);
memset(vis,0,sizeof(vis));
dis[sta]=1;
vis[sta]=1;
while(!q.empty())
{
int f=q.front();
q.pop();
vis[f]=0;
for(int i=1; i<=tot; i++)
{
if(dis[i]<dis[f]*g[f][i])
{
dis[i]=dis[f]*g[f][i];
if(dis[sta]>1)
{
// cout<<dis[sta]<<endl;
return 1;
}
if(!vis[i])
{
q.push(i);
vis[i]=1;
}
}
}
}
return 0;
}
int main()
{
int n,m,cas=0;
while(cin>>n&&n)
{
memset(g,0,sizeof(g));
tot=0;
mp.clear();
string s;
for(int i=0; i<n; i++)
{
cin>>s;
mp[s]=++tot;
}
cin>>m;
for(int i=1; i<=tot; i++)
{
for(int j=1; j<=tot; j++)
{
if(i!=j) g[i][j]=0;
else g[i][j]=1;
}
}
for(int i=0; i<m; i++)
{
string s1,s2;
double w;
cin>>s1>>w>>s2;
g[mp[s1]][mp[s2]]=w;
}
cout<<"Case "<<++cas<<": ";
if(spfa(1))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
// cout<<"dis"<<endl;
/* for(int i=1; i<=n; i++)
{
cout<<dis[i]<<endl;
}*/
}
return 0;
}