HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217
题目大意:问你是否可以通过转换货币从中获利
如下面这组样例:
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar
可以通过US->Br->French->US这样转换,把1美元变成1*0.5*10*0.21=1.05美元赚取%5的利润。
解题思路:其实就相当于bellman-ford里的负环判断,负环的意思是沿着走一圈回到原点后路径会变短了。这里我们可以把路径的减小转化为货币价值的增加,如果最后回到起点(i==V-1)继续更新别的点(i==V),说明起点价值相对原来变大了。也可以用floyd写,查看个点价值是否变大。
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
const int N=;
const int INF=<<-;
struct edge{
int from,to;
double rate;
}eg[N*N]; int V,E;
double d[N]; bool bellman_ford(int s){
for(int i=;i<=V;i++){
d[i]=;
}
d[s]=1.0;//初始货币为1 for(int i=;i<=V;i++){
for(int j=;j<=E;j++){
edge e=eg[j];
//这里是判断会不会变大
if(d[e.to]<d[e.from]*e.rate){
d[e.to]=d[e.from]*e.rate;
if(i==V) return true;//想当于d[s]>1.0
}
}
}
return false;
} int main(){
int cas=;
while(cin>>V&&V){
map<string,int>mp;
string s;
for(int i=;i<=V;i++){
cin>>s;
mp[s]=i;
}
cin>>E;
for(int i=;i<=E;i++){
string s1,s2;
double rate;
cin>>s1>>rate>>s2;
eg[i].from=mp[s1];
eg[i].to=mp[s2];
eg[i].rate=rate;
}
bool flag=false;
//对每种货币都尝试一遍
for(int i=;i<=V;i++){
flag=bellman_ford(i);
if(flag){
cout<<"Case "<<++cas<<": Yes"<<endl;
break;
}
}
if(!flag)
cout<<"Case "<<++cas<<": No"<<endl;
}
return ;
}
Floyd:
#include<iostream>
#include<string>
#include<map>
using namespace std;
const int N=;
const int INF=<<-; int V,E;
double val[N][N]; void floyd(){
for(int k=;k<=V;k++){
for(int i=;i<=V;i++){
for(int j=;j<=V;j++){
if(val[i][j]<val[i][k]*val[k][j])
val[i][j]=val[i][k]*val[k][j];
}
}
}
} int main(){
int cas=;
while(cin>>V&&V){
map<string,int>mp;
//路径初始化为0,各个点初始化为1
for(int i=;i<=V;i++){
for(int j=;j<=V;j++){
val[i][j]=(i==j?:);
}
}
for(int i=;i<=V;i++){
string s;
cin>>s;
mp[s]=i;
}
cin>>E;
for(int i=;i<=E;i++){
string s1,s2;
double trate;
cin>>s1>>trate>>s2;
val[mp[s1]][mp[s2]]=trate;
}
floyd();
bool flag=false;
//每个点都看一遍是否可以获得利益
for(int i=;i<=V;i++){
if(val[i][i]>){
flag=true;
break;
}
}
if(flag){
cout<<"Case "<<++cas<<": Yes"<<endl;
}
else{
cout<<"Case "<<++cas<<": No"<<endl;
}
}
}
HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)的更多相关文章
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- poj1860 兑换货币(bellman ford判断正环)
传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...
- 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【最短路/SPFA判断负环模板】
农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...
- spfa判断负环
会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...
- POJ3259(Wormholes) 判断负环
题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...
- spfa 判断负环 (转载)
当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...
- POJ 3259 Wormholes ( SPFA判断负环 && 思维 )
题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...
- 利用Bellman-Ford算法(有向图) 判断负环
// 根据Bellman-Ford算法的原理 // 判断负环(算法的最大更新次数,应该是顶点数-1次) // 而如果存在负环,算法会一直更新下去 // 我们根据循环进行的次数,来判断负环 #inclu ...
随机推荐
- 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
1. 在Oracle官网(http://www.oracle.com/technetwork/topics/winsoft-085727.html)下载文件: instantclient-basic- ...
- Ubuntu下Sublime Text 2优化配置
以前经常用Notepad++,最近因为需要长期在Linux环境下进行C开发,就使用了sublime Text 2,这里就不介绍基本的了主要针对我使用的经验中进行一些总结. 1.pacage contr ...
- python中如何优雅续行和换行
http://note.youdao.com/noteshare?id=8dbcb93991a89a6cfcd95580ed2198f0
- 11.UiAutomator 相关JAVA知识
一.封装方法与模块化用例 1.方法: 在JAVA中,方法就好比日常生活中的一个动作,由动作组合成一系列完整的操作. 方法结构: 方法修饰符 方法返回值类型 方法名 { 方法体 } 比如: public ...
- Linux iptables:规则组成
<Linux iptables:规则原理和基础>介绍了iptables的四表五链,简单说就是不同的网络层数据包会经过哪几个挂载点,在每个挂载点可以在哪张表进行规则定义. 本篇沿着这个思路, ...
- grep index.php *
zb@zb-computer:/usr/local/nginx/conf/vhost$ grep index.php * caomall17.conf: index index.html index. ...
- 关于HttpURLConnection/HttpsURLConnection请求出现了io.filenotfoundexception:url的解决方法
//从输入流读取返回内容InputStream is = null;int status = connection.getResponseCode();if(status>= HttpStatu ...
- C语言 两个小知识点
strlen 函数原型 extern unsigned int strlen(char *s); 在Visual C++ 6.0中,原型为size_t strlen(const char *strin ...
- [吴恩达机器学习笔记]14降维3-4PCA算法原理
14.降维 觉得有用的话,欢迎一起讨论相互学习~Follow Me 14.3主成分分析原理Proncipal Component Analysis Problem Formulation 主成分分析( ...
- html常见页面动画插件
wow.js页面滚动动画 scrollever.js页面滚动动画 textillate.js页面字体效果 ihover.js手表hover效果插件 loaders.css页面预加载动画