题目链接: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. Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程

    Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...

  2. elk +redis 环境搭建

    这个是最新的elk+redis搭建日志分析平台,今年时间是2015年9月11日. Elk分别为 elasticsearch,logstash, kibana 官网为:https://www.elast ...

  3. Python3 字典 get() 方法

     Python3 字典 描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: dict.get(key, default=None) 参数 ...

  4. Django 分页 以及自定义分页

    Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表.元组或其它可迭代的对象. 基本语法 1 2 3 4 5 6 7 8 9 ...

  5. Stanford机器学习---第十四讲.机器学习应用举例之Photo OCR

    http://blog.csdn.net/l281865263/article/details/50278745 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Oc ...

  6. windows环境下封装条件wait和signal

    linux 环境有提供好的pthread_cond_wait() 和 phread_signal().pthread_broadcast() windows需要自己封装,利用semophore控制线程 ...

  7. shell多进程的实现

    需求:多个脚本彼此互不干涉,同时运行,节省时间 菜鸟级实现: #!/bin/sh dir="/data/test" $dir/sbin/test1.sh >> $dir ...

  8. 【Java-GUI】homework~QQ登录界面

    话说有图有真相:(图片文件自己ps吧,动态网页未添加成功,后附html源码) Java源码: import javax.swing.*; import java.awt.*; import java. ...

  9. java绝对路径和相对路径的理解

    日常开发中引用东西经常会遇到路径问题,各种尝试,各种出错,其实只要理解了这两种路径,问题便迎刃而解. 在java中路径有两种表示方法:绝对路径和相对路径. (1) 相对路径:它以不带“\”的目录名表示 ...

  10. CSS进阶知识

    html { -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } 该属性的作用是 ...