题目链接: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)的更多相关文章

  1. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  2. poj1860 兑换货币(bellman ford判断正环)

    传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...

  3. POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)

    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...

  4. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  5. spfa判断负环

    会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...

  6. POJ3259(Wormholes) 判断负环

    题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...

  7. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  8. POJ 3259 Wormholes ( SPFA判断负环 && 思维 )

    题意 : 给出 N 个点,以及 M 条双向路,每一条路的权值代表你在这条路上到达终点需要那么时间,接下来给出 W 个虫洞,虫洞给出的形式为 A B C 代表能将你从 A 送到 B 点,并且回到 C 个 ...

  9. 利用Bellman-Ford算法(有向图) 判断负环

    // 根据Bellman-Ford算法的原理 // 判断负环(算法的最大更新次数,应该是顶点数-1次) // 而如果存在负环,算法会一直更新下去 // 我们根据循环进行的次数,来判断负环 #inclu ...

随机推荐

  1. 关于在VWmare下安装Redhat

    本文是小白博主自行摸索安装的过程,下文主要是给出几篇很有用的文章出处和自己遇到的问题. 一.关于安装包 对于安装包,个人建议是去官网下载(个人安装的是rhel 7.4),可能初接触Linux时,是不是 ...

  2. 把lighttpd配置为系统服务

    每次启动切换到 /usr/local/lighttpd/sbin 执行 ./lighttpd -f /usr/local/lighttpd/lighttpd.conf 比较麻烦, 而且不方便重新启动! ...

  3. mac Source Tree免登陆方法

    打开SourceTree -> 点击菜单栏的 窗口 选项 -> 点击显示托管在远端的仓库 -> 点击登录注册页面右上角的关闭按钮 -> 点击Quit -> 点击确定关闭刷 ...

  4. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  5. 排座位&&Little Elephant And Permutation——排列dp的处理

    排列的问题,就是要把序列排个序,使之达到某种最优值或者统计方案数 dp可以解决部分排列问题. 通常的解决方案是,按照编号(优先级)排序决策,从左到右决策两种. 这里主要是第一个. 排座位• 有

  6. pxp

    Time Limit: 2000 ms Memory Limit: 512 MB Description 给定 \(n\), 求\(\sum\limits_{p,q∈primes}[pq≤n]\) ( ...

  7. 洛谷P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  8. [吴恩达机器学习笔记]12支持向量机4核函数和标记点kernels and landmark

    12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 12.4 核函数与标记点- Kernels and landmarks 问题引入 如果你有以下的训练集,然后想去拟合其能够分开 ...

  9. Linux下如何卸载软件(Debian系)

    说明:此方法适用于Debian.Ubuntu等带apt工具的操作系统. 步骤: 1.首先我们需要知道将要卸载的软件名称,比如我现在打算卸载tightvncserver,但是如果你不确定名称,没关系,可 ...

  10. Emacs ^ Vim

    Emacs存活: http://files.cnblogs.com/files/TheRoadToTheGold/Emacs%E2%80%94%E2%80%94%E5%AD%98%E6%B4%BB.z ...