给定一些货币(字符串形式)及汇率(实数),例如a可换x1个b,b可换x2个c,c可换x3个a;
问有没有可能1个a可以换出超过一个a的价值的情况
分析:
1.两者之间相换的汇率给出,a与b汇率x1,b与c汇率x2,那么a与c汇率就是x1*x2;
2.先初始化dis[i][i]为1.0,其它不能互换为0;
3.输入后,更新dis[i][j]的值;
4.利用floyed最短路思想,求出最大值;
5.结果就是dis[i][i]>1.0才符合情况
#include<bits/stdc++.h>
#define INF 0x7fffffffffffffff
#define ll long long
using namespace std;
int n,m;
double dis[1000][1000];
void init()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=(i==j?1.0:0);
}
}
}
void floyed()
{
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]<dis[i][k]*dis[k][j]){
dis[i][j]=dis[i][k]*dis[k][j];
}
}
}
}
}
int main()
{
while(cin>>n&&n!=0){
map<string,int>mp;
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++){
string s;
cin>>s;
mp[s]=i;
}
init();
cin>>m;
for(int i=1;i<=m;i++){
string a,b;
double val;
cin>>a>>val>>b;
dis[mp[a]][mp[b]]=val;
}
floyed();
int i;
for(i=1;i<=n;i++){
if(dis[i][i]>1.0)
break;
}
if(i==n+1)cout<<"no "<<i<<endl;
else cout<<"yes "<<i<<endl;
}
return 0;
}