Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。

这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。

由于此题中需要求的是有一种货币A,通过一系列的转化,能够再次转化回A,因此,运用bellman算法来解决此题。

具体的关于bellman最短路的求法请见转载博客:http://www.cnblogs.com/aiguona/p/7226533.html

题目链接:https://vjudge.net/problem/HDU-1217

题目描述:

代码描述:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <iostream>
using namespace std; const int MAX_E = ;
const int MAX_V = ;
const int INF = 0x3f3f3f3f;
struct node{
int from,to;
double cost;
}es[MAX_E*];//用于存图
int cae=;
int V,E;
double d[MAX_V];
map<string,int> mp;//将字符串问题转换为数字问题
bool bellman(int s){
//fill(d,d+MAX_V,-2);
for(int i=;i<MAX_V;i++){
d[i]=-;
}
d[s]=;//是初始值为1,假设某人有1块钱,用这1块钱去做交换
for(int j=;j<V;j++){//进行反复松弛操作,使得每个节点的最短距离估计值逐步逼近其最短距离
bool update=false;
for(int i=;i<E;i++){
if(d[es[i].from]!=- && d[es[i].to] < d[es[i].from]*es[i].cost){
if(j==V-){//当执行到V-1次循环时,说明该货币已经转换回来了
return true;
}
d[es[i].to]=d[es[i].from]*es[i].cost;
update=true;
}
}
if(!update) break;//优化这里,如果这趟没跟新任何节点就可以直接退出了。
}
return false;
} void solve(){
bool flag=false;
for(int i=;i<V;i++){//对于每一种存在的货币来说,都遍历一遍
if(bellman(i)){//如果说存在一种货币能够转换回来并且盈利,则成功,可直接退出
flag=true;
break;
}
}
if(flag){
cout << "Case " << ++cae << ": Yes" << endl;
}else{
cout << "Case " << ++cae << ": No" << endl;
}
} int main(){
//ios::sync_with_stdio(false)的用法:详见博客 https://blog.csdn.net/vocaloid01/article/details/77892490
ios::sync_with_stdio(false);//这样就可以取消cin于stdin的同步,使得cin的效率与scanf差不多,其中sync好像是同步的意思
while(cin>> V && V){
mp.clear();
for(int i=;i<V;i++){
string str;
cin >> str;
mp[str]=i;//将str的“下标”赋值为i,即为了方便后续存图,用数字i来代替字符串str
}
cin >> E;
map<string,int>::iterator it;//迭代器用于遍历map中的元素
for(int i=;i<E;i++){
string str1,str2;
double cost;
cin >> str1 >> cost >> str2;
it=mp.find(str1);//查找函数,即找到str1在mp中的位置
es[i].from=it->second;//将找到的str1对应的“下标”,将结点i的起点值赋值为str1所对应的下标值
it=mp.find(str2);
es[i].to=it->second;//将找到的str2对应的“下标”,将结点i的终点值赋值为str1所对应的下标值
es[i].cost=cost;//把结点i由起点from->to所对应的边的边长赋值为cost
}
solve();
}
return ;
}

最短路(bellman)-hdu1217的更多相关文章

  1. 蓝桥杯 算法训练 最短路 [ 最短路 bellman ]

    传送门   算法训练 最短路   时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证 ...

  2. poj 3259 Wormholes(最短路 Bellman)

    题目:http://poj.org/problem?id=3259 题意:一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路,虫洞有这样的性质: 时间倒流.问你这 ...

  3. NITACMOJ144稳定串

    点我>>题目链接 稳定串 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java ...

  4. 蓝桥杯 algo_5 最短路 (bellman,SPFA)

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...

  5. 最短路(dijskra+SPFA+Bellman)

    最短路 Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  6. hdu-1317 XYZZY---Floyd判连通+bellman最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 题目大意: 题意:有n个房间(n<=100),每个房间有一个点权(第1号房间和第n号房间 ...

  7. Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化)

    Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回 ...

  8. 最短路(bellman)-hdu2066

    题目链接:https://vjudge.net/problem/HDU-2066 题目描述: 代码实现: #include <cstdio> #include <cstring> ...

  9. 最短路(Bellman)-Hdu1874畅通工程序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城 ...

随机推荐

  1. for循环中按条件删除数据元素

    var managerList = [ { id: 0, title: '小小消息的标题1', small: '小小消息内容', newsFlag:true, }, { id: 1, title: ' ...

  2. vscode开发c#

    转载自: http://www.cnblogs.com/lxhbky/p/6673230.html http://www.cnblogs.com/lxhbky/p/6692065.html 一.环境安 ...

  3. PID控制器开发笔记之五:变积分PID控制器的实现

    在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的.然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强.积分系数取大 ...

  4. log4net使用的两种方式

    1.首先添加log4net.dll引用(可以使用  管理NuGet程序包添加引用,也可以下载下来手动去添加引用) 2.在app.config文件中配置 3.log4net使用的2终方式 log4net ...

  5. laravel 获取当前月,当前星期,当天起始时间方法

    获取当前月起始时间: 1. $time=time(); $start=date('Y-m-01',$time);//获取指定月份的第一天 $end=date('Y-m-t',$time); //获取指 ...

  6. CPU虚拟化

    1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件.  Ring 是 ...

  7. 步步为营-104-SQL语句(截取字符串)

    按照指定字符截取字符串,截取出300 业务需求:想比对图片中框线部分是否一致 第一步 从最后一个/截取到末尾 select top 1 reverse(substring(reverse(Proces ...

  8. 步步为营-93-MVC+EF简单实例

    1:创建MVC项目 2:添加EF数据(这里选择DataBaseFirst模式) 3:添加控制器 3.1.1 创建列表页面 3.1.2 html页面 @using MvcApplication1 @{ ...

  9. Cannot uninstall 'html5lib'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

    如标题,安装Tensorflow-gpu时遇到的完整问题 Cannot uninstall 'html5lib'. It is a distutils installed project and th ...

  10. IDM的Google商店插件

    官方扩展链接:https://chrome.google.com/webstore/detail/idm-integration-module/ngpampappnmepgilojfohadhhmbh ...