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. Modbus库开发笔记之八:CRC循环冗余校验的研究与实现

    谈到Modbus通讯自然免不了循环冗余校验(CRC),特别是在标准的串行RTU链路上是必不可少的.不仅如此在其他开发中,也经常要用到CRC 算法对各种数据进行校验.这样一来,我们就需要研究一下这个循环 ...

  2. Confluence 6 配置文件和key

    找到配置文件 缓存的配置文件是存储在 <confluence-home>/shared-home/config/cache-settings-overrides.properties 中的 ...

  3. Confluence 6 手动备份

    Confluence 的 Attachment Storage Configuration 可以配置 Confluence 将附件存储在  home directory,或者是存储在数据库中. Dat ...

  4. bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑

    进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的 ...

  5. poj3662 二分+最短路

    /* 给定一张无向图,要求找到1-n的路径,该路径上第k+1大的边是所有路径上最小的 如果没有1-n的路,那么输出-1 二分答案mid,遍历一次所有边,如果边权小于mid,则设为0,大于mid,则设为 ...

  6. gitlab的完全卸载

    一:先停止gitlab gitlab-ctl stop 二:卸载gitlab部分(之前我是rpm安装的,这里rpm卸载) rpm  -e  gitlab-ce 三:发现系统进程还有一个gitlab的进 ...

  7. azkaban group分组,权限

    翻译自:https://azkaban.readthedocs.io/en/latest/userManager.html?highlight=group 1.job project,名为" ...

  8. install memcached for ubuntu

    Memcached安装 1.先下载安装libevent 安装 libevent# tar zxvf libevent-1.4.9-stable.tar.gz# cd libevent-1.4.9-st ...

  9. 【C++ Primer | 15】访问控制与继承、继承中的类作用域

    1. 只有D继承B的方式是public时,用户代码才能使用派生类向基类的转换:如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换. 2. 不论D以什么方式继承B,D的成员函数和友员函数都 ...

  10. Win10如何禁止软件运行?win10禁止软件启动的设置方法!禁止人生日历热点快讯的方法

    相信不少使用Win10系统的用户遇到过下载了一款软件进行安装后后续会有接连不断的程序安装到电脑中.他可能似乎一个大家常用的程序,在我们安装好运行的时候会通过后台偷偷下载其他应用安装到我们电脑中,导致系 ...