POJ 2240 Arbitrage (求负环)
Arbitrage
题目链接:
http://acm.hust.edu.cn/vjudge/contest/122685#problem/I
Description
Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent.
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
The input will contain one or more test cases. Om the first line of each test case there is an integer n (1
Output
For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".
Sample Input
3
USDollar
BritishPound
FrenchFranc
3
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar
3
USDollar
BritishPound
FrenchFranc
6
USDollar 0.5 BritishPound
USDollar 4.9 FrenchFranc
BritishPound 10.0 FrenchFranc
BritishPound 1.99 USDollar
FrenchFranc 0.09 BritishPound
FrenchFranc 0.19 USDollar
0
Sample Output
Case 1: Yes
Case 2: No
Hint
##题意:
求货币经过一系列兑换操作后能否升值.
##题解:
转化为图模型后就是求满足条件的环是否存在.
这里把求最短路时的加法改成乘法即可,结果就是是否存在环使得路径大于1.
以下分别用三种方法求:
bellman-ford和floyd用时都较多,800+ms.
spfa只需要90+ms, 不过需要用c++交,否则TLE.(真是神奇)
##代码:
####spaf法:94ms (必须用c++交,否则TLE)
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 1100
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int m,n,k;
int edges, u[maxn], v[maxn];
double w[maxn];
int first[maxn], _next[maxn];
double dis[maxn];
void add_edge(int s, int t, double val) {
u[edges] = s; v[edges] = t; w[edges] = val;
_next[edges] = first[s];
first[s] = edges++;
}
queue q;
bool inq[maxn];
int inq_cnt[maxn];
bool spfa(int s) {
memset(inq, 0, sizeof(inq));
memset(inq_cnt, 0, sizeof(inq_cnt));
for(int i=1; i<=n; i++) dis[i] = 0; dis[s] = 1;
while(!q.empty()) q.pop();
q.push(s); inq_cnt[s]++;
while(!q.empty()) {
int p = q.front(); q.pop();
inq[p] = 0;
for(int e=first[p]; e!=-1; e=_next[e]) {
double tmp = dis[u[e]] * w[e];
if(dis[v[e]] < tmp) {
dis[v[e]] = tmp;
if(!inq[v[e]]) {
q.push(v[e]);
inq[v[e]] = 1;
inq_cnt[v[e]]++;
if(inq_cnt[v[e]] >= n) return 0;
}
}
}
}
return 1;
}
map<string,int> name;
int main(int argc, char const *argv[])
{
//IN;
int ca = 1;
while(scanf("%d", &n) != EOF && n)
{
memset(first, -1, sizeof(first));
edges = 0;
name.clear();
for(int i=1; i<=n; i++) {
string s; cin >> s;
name.insert(make_pair(s, i));
}
cin >> m;
for(int i=1; i<=m; i++) {
string s,t; double w;
cin>> s >> w >> t;
int u = name.find(s)->second;
int v = name.find(t)->second;
add_edge(u,v,w);
}
if(!spfa(1)) printf("Case %d: Yes\n", ca++);
else printf("Case %d: No\n", ca++);
}
return 0;
}
####bellman-ford法:875ms
``` cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define LL long long
#define eps 1e-8
#define maxn 1100
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int m,n,k;
int edges, u[maxn], v[maxn];
double w[maxn];
int first[maxn], next[maxn];
double dis[maxn];
void add_edge(int s, int t, double val) {
u[edges] = s; v[edges] = t; w[edges] = val;
next[edges] = first[s];
first[s] = edges++;
}
bool bellman(int s) {
for(int i=1; i<=n; i++) dis[i]=0; dis[s] = 1;
for(int i=1; i<=n; i++) {
for(int e=0; e<edges; e++) {
double tmp = dis[u[e]] * w[e];
if(dis[v[e]] < tmp) {
dis[v[e]] = dis[u[e]] * w[e];
if(i == n) return 0;
}
}
}
return 1;
}
map<string,int> name;
int main(int argc, char const *argv[])
{
//IN;
int ca = 1;
while(scanf("%d", &n) != EOF && n)
{
memset(first, -1, sizeof(first));
edges = 0;
name.clear();
for(int i=1; i<=n; i++) {
string s; cin >> s;
name.insert(make_pair(s, i));
}
cin >> m;
for(int i=1; i<=m; i++) {
string s,t; double w;
cin>> s >> w >> t;
int u = name.find(s)->second;
int v = name.find(t)->second;
add_edge(u,v,w);
}
if(!bellman(1)) printf("Case %d: Yes\n", ca++);
else printf("Case %d: No\n", ca++);
}
return 0;
}
floyd法:875ms
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define LL long long
#define eps 1e-8
#define maxn 35
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int m,n,k;
double dis[maxn][maxn];
void floyd() {
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(dis[i][j] < dis[i][k]*dis[k][j])
dis[i][j] = dis[i][k] * dis[k][j];
}
map<string,int> name;
int main(int argc, char const *argv[])
{
//IN;
int ca = 1;
while(scanf("%d", &n) != EOF && n)
{
name.clear();
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
dis[i][j] = (i==j? 1.0:inf);
for(int i=1; i<=n; i++) {
string s; cin >> s;
name.insert(make_pair(s, i));
}
cin >> m;
for(int i=1; i<=m; i++) {
string s,t; double w;
cin>> s >> w >> t;
int u = name.find(s)->second;
int v = name.find(t)->second;
dis[u][v] = w;
}
floyd();
int flag = 1;
for(int i=1; i<=n; i++)
if(dis[i][i] > 1.0) {flag = 0;break;}
if(!flag) printf("Case %d: Yes\n", ca++);
else printf("Case %d: No\n", ca++);
}
return 0;
}
POJ 2240 Arbitrage (求负环)的更多相关文章
- POJ 2240 Arbitrage (spfa判环)
Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- POJ 3259 Wormholes(最短路径,求负环)
POJ 3259 Wormholes(最短路径,求负环) Description While exploring his many farms, Farmer John has discovered ...
- 最短路(Floyd_Warshall) POJ 2240 Arbitrage
题目传送门 /* 最短路:Floyd模板题 只要把+改为*就ok了,热闹后判断d[i][i]是否大于1 文件输入的ONLINE_JUDGE少写了个_,WA了N遍:) */ #include <c ...
- bzoj 1486: [HNOI2009]最小圈 dfs求负环
1486: [HNOI2009]最小圈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1022 Solved: 487[Submit][Status] ...
- Contest20140710 loop bellman-ford求负环&&0/1分数规划
loop|loop.in|loop.out 题目描述: 给出一个有向带权图,权为边权,求一个简单回路,使其平均边权最小. 简单回路指不多次经过同一个点的回路. 输入格式: 第一行两个整数,表示图的点数 ...
- poj 2240 Arbitrage 题解
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21300 Accepted: 9079 Descri ...
- POJ3259 Wormholes —— spfa求负环
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- poj 2240 Arbitrage(Bellman_ford变形)
题目链接:http://poj.org/problem?id=2240 题目就是要通过还钱涨自己的本钱最后还能换回到自己原来的钱种. 就是判一下有没有负环那么就直接用bellman_ford来判断有没 ...
- ACM: POJ 3259 Wormholes - SPFA负环判定
POJ 3259 Wormholes Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
随机推荐
- java怎样读取数据库表中字段的数据类型?
用DriverManager.getConnection()得到connect, 用connect.getMetaData()得到 DatabaseMetaData, 用 DatabaseMetaDa ...
- HDU 4869 Turn the pokers (2014 Multi-University Training Contest 1)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- UVa 11889 (GCD) Benefit
好吧,被大白书上的入门题给卡了.=_=|| 已知LCM(A, B) = C,已知A和C,求最小的B 一开始我想当然地以为B = C / A,后来发现这时候的B不一定满足gcd(A, B) = 1 A要 ...
- 《C++ Primer 4th》读书笔记 第5章-表达式
原创文章,转载请注明出处: http://www.cnblogs.com/DayByDay/p/3912114.html
- Hibernate优化
前言 在一般情况下,Hibernate需要将执行转换为SQL语句从而性能低于JDBC.但是在经过比较好的性能优化之后,性能还是让人相当满意的,特别是应用二级缓存之后,甚至可以获得比较不使用缓存的JDB ...
- CF 577B Modulo Sum
题意:给一个长度为n的正整数序列,问能不能找到一个不连续的子序列的和可以被m整除. 解法:抽屉原理+dp.首先当m<n时一定是有答案的,因为根据抽屉原理,当得到这个序列的n个前缀和%m时,一定会 ...
- 记录一下学习Android时遇到一些问题
实在是不擅长Android开发,但在努力的学习当中.这篇文章就记录一下学习过程中,自己犯下的一些错误,同时也让自己记住别再犯同样的错误了.各位看官勿见笑! 一个关于空指针的错误 错误类型一: 未对对象 ...
- Python多线程和Python的锁
Python多线程 Python中实现多线程有两种方式,一种基于_thread模块(在Python2.x版本中为thread模块,没有下划线)的start_new_thread()函数,另一种基于th ...
- apache环境下配置服务器支持https
SSL加密的意义在于保护服务器到客户端的信息或者是客户端到服务器的信息不被监听和篡改. 现在一些主流的网站都已经是通过 https访问了,搜索引擎对此类网站的收录也不存在问题了. 具体的配置流程大概是 ...
- PHP获取Cookie模拟登录
关键字:CURL Cookie CURLOPT_COOKIEJAR CURLOPT_COOKIEFILE 模拟登录 PHP作者:方倍工作室原文:http://www.cnblogs.com/txw19 ...