题目链接: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. [知识点]C++中STL容器之set

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 继上期的vector之后,我们又迎来了另一个类数组的STL容器——set. 二.用途与特性 set,顾名思义,集合 ...

  2. 【bzoj4011】落忆枫音

    Portal --> bzoj4011 Solution ​ 这题..看了一眼之后深陷矩阵树定理然后我看了一眼数据范围== 注意到是有向无环图,DAG有十分多优秀的性质所以,这题需要充分利用这个 ...

  3. 【bzoj4520】K远点对

    Portal --> bzoj4520 Description 给你平面内\(n\)个点的坐标,求欧氏距离下第\(k\)远的点对 Solution 因为kd其实..严格来说挺不熟的用的太少了qw ...

  4. Linux基础-----------nginx安装和nginx web、nginx反向代理、nfs 服务

    作业一:nginx服务1)二进制安装nginx包 yum install epel-release -y 先安装epel-release 再查看yum源中已经安装上了epel相关文件 中间省去了一些安 ...

  5. SAS数据步与过程步,数据步语句

    SAS数据步与过程步,数据步语句http://www.biostatistic.net/thread-2045-1-1.html  ---转载---原文作者:biostar(出处: 生物统计家园) 数 ...

  6. poj 1185 状态压缩

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27926   Accepted: 10805 Descriptio ...

  7. poj 3261 后缀数组 可重叠的 k 次最长重复子串

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16430   Accepted: 7252 Ca ...

  8. linux 隐藏权限

    原文 ------通过chattr设置档案的隐藏权限------ [root@sdc ~]#chattr --helpUsage: chattr [-RV] [-+=AacDdijsSu] [-v v ...

  9. 洛谷 2186 小Z的栈函数

    https://www.luogu.org/problem/show?pid=2186 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: N ...

  10. 2017 国庆湖南 Day3

    期望得分:100+30+60=190 实际得分:10+0+55=65 到了233 2是奇数位 或223 第2个2是偶数位就会223 .233 循环 #include<cstdio> #de ...