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
",&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;
}