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; }