题意:给你N中货币以及名称,m种货币的交换汇率,问是否存在一种交换途径,从某种货币开始到该货币结束,交换完不少却多的情况
思路:汇率交换问题一般就是求正权回路的问题,和 POJ-1860是基本上一样的问题,我们可以使用bellman-ford算法来判断,通过 对每个点循环m次松弛操作,如果最后还会改变,说明出现正权回路
此外,就是将货币名称用map映射一下
完整代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<map> using namespace std; const int maxe=2500; const int maxn=50; int n,m; map<string,int> G; int top; double dis[maxn]; struct Edge { int from,to; double val; } edge[maxe]; void add(int from,int to,double val) { edge[top].from=from; edge[top].to=to; edge[top++].val=val; } bool Bellman(int s) { memset(dis,0,sizeof dis); dis[s]=1; for(int i=1; i<=n; i++) { for(int j=0; j<top; j++) { if(dis[edge[j].to]<dis[edge[j].from]*edge[j].val) dis[edge[j].to]=dis[edge[j].from]*edge[j].val; } } if(dis[s]>1.0) return true; else return false; } int main(void) { int cnt=0; while(cin>>n&&n) { top = 0; G.clear();//TODO:我觉得没有这个也没有事情 string s,s1,s2; for(int i=1; i<=n; i++) cin>>s,G[s]=i; cin>>m; double rate; for(int i=0; i<m; i++) { cin>>s1>>rate>>s2; add(G[s1],G[s2],rate); } int i; for(i=1; i<=n; i++)//因为任意一个结点上有正权环都可以输出“YES”,所以我们这里遍历所有结点。 if(Bellman(i)) break; cout<<"Case "<<++cnt<<": "; if(i==n+1) cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }