POJ 2240Arbitrage
题意:给一系列的货币,并给出其转化比率,问你是否存在一种转换关系使自己获得利息;从题意来说很简单一个判正环的,因为只要出现正环,就一定存在获得利息,所以spfa判正环即可;对于输入的字符串可以采用map用编号替换掉
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
int first[10005];int next[10005];
typedef struct node{
int x;
int y;
double e;
}node;
node vulue[10005];
double dis[105];
bool vis[105];int ci[105];
int main(){
int m;
string a;
map<string,int>ma;
int r=0;
while(scanf("%d\n",&m) && m){
r++;
for(int i=1;i<=m;i++){
cin>>a;
ma.insert(make_pair(a,i));
}
memset(first,-1,sizeof(first));
int n;
cin>>n;
map<string,int>::iterator it;
map<string,int>::iterator ip;
string c,d;
double e;
for(int i=1;i<=n;i++){
cin>>c>>e>>d;
it=ma.find(c);
ip=ma.find(d);
vulue[i].x=(*it).second;vulue[i].y=(*ip).second;vulue[i].e=e;
next[i]=first[vulue[i].x];
first[vulue[i].x]=i;
}
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(ci,0,sizeof(ci));
dis[1]=1;
queue<int>que;
que.push(1);
vis[1]=1;
ci[1]++;
int flag=0;
while(!que.empty()){
int u=que.front();
que.pop();
vis[u]=0;
for(int j=first[u];j!=-1;j=next[j]){
// cout<<vulue[j].y<<endl;
if(dis[vulue[j].y]<dis[u]*vulue[j].e){
dis[vulue[j].y]=dis[u]*vulue[j].e;
// cout<<dis[vulue[j].y]<<endl;
if(vis[vulue[j].y]==0){
vis[vulue[j].y]=1;
ci[vulue[j].y]++;
que.push(vulue[j].y);
if(ci[vulue[j].y]>m){
flag=1;
break;
}
}
}
}
if(flag==1){
break;
}
}
cout<<"Case "<<r<<": ";
if(flag==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
ma.clear();
}
return 0;
}

浙公网安备 33010602011771号