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. Android 目前最稳定和高效的UI适配方案

    Android系统发布十多年以来,关于Android的UI的适配一直是开发环节中最重要的问题,但是我看到还是有很多小伙伴对Android适配方案不了解.刚好,近期准备对糗事百科Android客户端设计 ...

  2. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

  3. 使用 mod_rewrite 来修改 Confluence 6 的 URLs

    备注:这个页面的文档是 Apache 的配置,而不是 Confluence 自己的配置.Atlassian 将会对 Confluence 的配置提供支持,但是我们不能保证能够对你所有在配置 Apach ...

  4. libopencv_highgui.so.2.4.9:对‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定义的引用

    make之前加上sudo su重新make即可 http://blog.csdn.net/cfyzcc/article/details/52981467

  5. spring boot 配置文件

    spring boot使用一个全局配置文件:主要是以下两种类型 application.properties  :例:server.port=9998 application.yml(YAML)  : ...

  6. burpsuite使用教程和实战详解(一)

    1.最近做渗透测试,其实使用一种方式很难全面的对一个web或者app等安全服务器做安全评估,所以要尽可能的对网络安全的渗透测试有一个较全面的认知.不光要熟悉前端和 后天的编程,还有掌握基于这两种编程的 ...

  7. XSS-HTML&javaSkcript&CSS&jQuery&ajax-CSS

    CSS 1.表单的处理 <style> table, td, th{ border:1px; solid green;} th{ background-color:green; color ...

  8. php 重要函数归集

    1.json_encode 与 json_decode json_encode 把数组转化成字符串 json_encode(array) json_decode 把目标字符串转成数组json_deco ...

  9. 步步为营-89-SQL语句(删除重复数据)

    1:删除重复数据 --第一步:先找到重复数据 select ProcInstID from record_errorlog group by ProcInstID having count(ProcI ...

  10. IDEA的debug操作