您的位置:首页 > 其它

Poj_2240 Arbitrage(最短路)

2016-12-22 15:33 225 查看
题意:

套利就是利用汇率的差异使自己的财富得到增加。给出几种货币之间的汇率,问能否通过套利使得财富增加。

思路:

转换为寻找有向图中是否有环。使用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 最短路