Poj_2240 Arbitrage(最短路)
2016-12-22 15:33
225 查看
题意:
套利就是利用汇率的差异使自己的财富得到增加。给出几种货币之间的汇率,问能否通过套利使得财富增加。
思路:
转换为寻找有向图中是否有环。使用Bellman-Ford和SPFA分别实现了一下,SPFA稍微快一点,注意SPFA是入队超过N次。
代码实现:
套利就是利用汇率的差异使自己的财富得到增加。给出几种货币之间的汇率,问能否通过套利使得财富增加。
思路:
转换为寻找有向图中是否有环。使用Bellman-Ford和SPFA分别实现了一下,SPFA稍微快一点,注意SPFA是入队超过N次。
代码实现:
//Bellman-Ford #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> #include <algorithm> using namespace std; const int MAX_V = 32; struct Edge{ int from; int to; double rate; }; int N,M; int cnt; bool flag; double curr[MAX_V]; map<string,int> mm; Edge edge[MAX_V*MAX_V]; bool find_loop(); int main() { cnt = 1; while( scanf("%d",&N) != EOF ){ if( N == 0 ){ break; } string a,b; mm.clear(); for( int i = 0; i < N; i++ ){ cin>>a; mm[a] = i+1; } double rate; scanf("%d",&M); for( int i = 0; i < M; i++ ){ cin>>a>>rate>>b; edge[i].from = mm[a]; edge[i].to = mm[b]; edge[i].rate = rate; } flag = find_loop(); if( flag == true ){ printf("Case %d: Yes\n",cnt++); } else{ printf("Case %d: No\n",cnt++); } } return 0; } bool find_loop(){ memset(curr,0,sizeof(curr)); curr[1] = 1; for( int i = 0; i < N; i++ ){ for( int j = 0; j < M; j++ ){ Edge e = edge[j]; if( curr[e.to] < curr[e.from]*e.rate ){ curr[e.to] = curr[e.from]*e.rate; if( i == N-1 ){ return true; } } } } return false; } //SPFA #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> #include <vector> #include <queue> using namespace std; const int MAX_V = 32; struct Edge{ int to; double rate; Edge(const int to,const double rate){ this->to = to; this->rate = rate; } }; int N,M; int cnt; bool flag; int num[MAX_V]; queue<int> que; bool inque[MAX_V]; map<string,int> mm; double curr[MAX_V]; vector<Edge> edge[MAX_V]; int main(){ cnt = 1; while( scanf("%d",&N) != EOF ){ if( N == 0 ){ break; } string a,b; mm.clear(); for( int i = 0; i < MAX_V; i++ ){ edge[i].clear(); } for( int i = 0; i < N; i++ ){ cin>>a; mm[a] = i+1; } double rate; scanf("%d",&M); for( int i = 0; i < M; i++ ){ cin>>a>>rate>>b; int pa = mm[a]; int pb = mm[b]; edge[pa].push_back(Edge(pb,rate)); } flag = false; memset(num,0,sizeof(num)); memset(curr,0,sizeof(curr)); memset(inque,false,sizeof(inque)); curr[1] = 1; que.push(1); inque[1] = true; num[1]++; while( !que.empty() ){ int tmp = que.front(); que.pop(); inque[tmp] = false; if( flag == true ){ break; } int len = edge[tmp].size(); for( int i = 0; i < len; i++ ){ Edge e = edge[tmp][i]; if( curr[e.to] < curr[tmp]*e.rate ){ curr[e.to] = curr[tmp]*e.rate; if( inque[e.to] == false ){ inque[e.to] = true; num[e.to]++; que.push(e.to); if( num[e.to] > N ){ flag = true; break; } } } } } if( flag == true ){ printf("Case %d: Yes\n",cnt++); } else{ printf("Case %d: No\n",cnt++); } } return 0; }
相关文章推荐
- POJ 2240 Arbitrage(最短路 套汇)
- 最短路练习9/poj/2240 Arbitrage;正环:floyd或spfa解法;
- poj 2240 Arbitrage 最短路
- poj 2240 Arbitrage(最短路+Bellman-Ford)
- poj 2240 Arbitrage (最短路 bellman_ford)
- poj 2240 Arbitrage(Floyd最短路)
- Poj 1860 Currency Exchange + Poj 2240 Arbitrage (货币兑换问题+最短路)
- POJ 2240 Arbitrage 最短路 Floyd
- POJ 2240 Arbitrage (Floyd最短路变形)
- POJ 2240 Arbitrage(最短路Floyed)
- poj-2240-Arbitrage-spfa-最短路
- POJ 2240 Arbitrage (最短路)
- POJ 2240 Arbitrage(最短路)
- POJ - 2240 Arbitrage (最短路 Floyd算法 && Bellman-Ford算法)
- POJ 2240 Arbitrage(Ballman最短路)
- POJ-2240 Arbitrage( 最短路 )
- POJ 2240 Arbitrage 最短路正环存在问题
- POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
- POJ 2240 Arbitrage(最短路)
- poj 2240 Arbitrage 【最短路&&floyd】