pku 2240 Arbitrage
2011-06-27 15:39
357 查看
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <map> #define eps 1e-6 using namespace std; int m, n, count[32]; double Map[32][32]; map<string, int> money; string type; bool spfa() { queue<int> q; double dist[32]; int visited[32]; memset(visited, 0, sizeof(visited)); memset(count, 0, sizeof(count)); for(int i=1; i<=n; i++) dist[i]=0; dist[1]=1; visited[1]=1; q.push(1); while(!q.empty()) { int x=q.front(); q.pop(); if(count[x]>n) return 1; visited[x]=0; for(int i=1; i<=n; i++) { if(dist[x]*Map[x][i]>dist[i]+eps) { dist[i]=dist[x]*Map[x][i]; if(!visited[i]) { visited[i]=1; q.push(i); count[i]++; } } } } return 0; } int main() { int cas=1; while(scanf("%d", &n), n) { for(int i=1; i<=n; i++) { cin>>type; money[type]=i; } scanf("%d", &m); for(int i=1; i<=m; i++) { string coin1, coin2; double rate; cin>>coin1>>rate>>coin2; Map[money[coin1]][money[coin2]]=rate; } printf("Case %d: ", cas++); if(spfa()) puts("Yes"); else puts("No"); } return 0; }
题意:先输入N,表示有N种货币,接下来N行输入N种货币的名字
再输入M,表示有M种换法, 输入货币A,汇率RAB, 货币B
要求算出是否能通过兑换汇率赚钱
思路:spfa,用count[]计数,如果有一个的计数超过N,即为有负权环,然后,输出是Yes不是YES = =
相关文章推荐
- pku2240 Arbitrage
- pku 2240 Arbitrage 第一周训练——最短路
- pku2240 Arbitrage
- pku 2240 Arbitrage(floyd)
- POJ-2240 Arbitrage
- poj 2240 Arbitrage (Floyd)
- poj 2240 Arbitrage
- POJ 2240 Arbitrage (floyd变形)
- poj-2240-Arbitrage-最短路 BF
- poj 2240 Arbitrage
- POJ 2240 Arbitrage(最短路)
- poj 2240 Arbitrage
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
- poj 2240 Arbitrage 最短路变形 spfa
- POJ 2240 Arbitrage (Floyd)
- POJ 2240 Arbitrage【Bellman_ford坑】
- POJ 2240 Arbitrage
- POJ 2240 Arbitrage
- POJ 2240:Arbitrage:folyd最短路算法变形求有向图的盈利环存在
- poj2240 Arbitrage 图论,Floyd变形