题目链接: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. 【CF528D】Fuzzy Search(FFT)

    [CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...

  2. SNMP-网络管理协议

    SNMP协议简介: a. 轮询(Polling) -- 定时获取状态, 中断(Interrupt)--出问题通知 b. 共同体名(community) -- 口令--只读口令 --读写口令 使用SNM ...

  3. python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)

    一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否ob ...

  4. Ubuntu在vncviewer下Tab键失效

    打开命令行,运行如下命令即可解决: xfconf-query -c xfce4-keyboard-shortcuts -p /xfwm4/custom/'<'Super'>'Tab -r ...

  5. linux命令行设置git提示符

    http://note.youdao.com/noteshare?id=3b6b2ee0925964928fd63d2c51e6bcef

  6. PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件

    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...

  7. CountUp.js让页面数字跳动起来

    CountUp.js 无依赖的.轻量级的 JavaScript 类,可以用来快速创建以一种更有趣的动画方式显示数值数据.尽管它的名字叫 countUp,但其实可以在两个方向进行变化,这是根据你传递的 ...

  8. Excel 报表导入导出

    使用 Excel 进行报表的导入导出,首先下载相关的 jar 和 excel util. Excel Util 下载地址 引入依赖: <!-- poi office --> <dep ...

  9. 【机器学习】K-邻近算法的python 实现

    #!/usr/bin/python # -*- coding: utf-8 -*- from numpy import * import operator def createDataSet(): ' ...

  10. poj 3636

    Nested Dolls http://poj.org/problem?id=3636 Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...