HDU2544(Bellman-ford算法和Floyd算法)
思路:
1.初始化时将起点 s 到各个顶点 v 的距离 dist(s->v)
赋值为 ∞,dist(s->s)
赋值为 0;
2.后续进⾏最多 n-1 次遍历操作 (n 为顶点个数), 对所有的边进⾏松弛操作;
所谓的松弛,以边 ab 为例,若 dist(a) 代表起点 s 到达 a 点所需要花费的总数,dist(b)
代表起点 s 到达 b 点所需要花费的总数,weight(ab)
代表边 ab 权重,若存在: dist(a) +weight(ab) < dist(b)
则说明存在到 b 的更短的路径,s->...->a->b
, 更新 b 点的总花费为 (dist(a) +weight(ab))
,⽗节点为 a
3.遍历都结束后,若再进⾏⼀次遍历,还能得到 s 到某些节点更短的路径的话(dist(a) +weight(ab) < dist(b),
则图中存在负环路,即是说该图无法求出单源最短路径。否则数组dist[n]中记录的就是源点s到各顶点的最短路径长度),则说明存在负环路。
判断负环就完成循环以后再找⼀次,若还能更新,则
有负环。
方法一:Bellman-ford()
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
struct node{int u,v,w;
}num[maxx];
int dist[maxx];
int cnt;
int n,m;
int e[maxx][maxx];
void Bellman_ford(int u,int n){for(int i=1;i<=n;i++){dist[i]=inf;}dist[u]=0;int flag=1;while(flag){flag=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(e[i][j]!=inf&&dist[j]>dist[i]+e[i][j]){dist[j]=dist[i]+e[i][j];flag=1;}}}if(flag==0)break;}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){e[i][j]=inf;}}for(int i=1;i<=m;i++){int u,v,cost;scanf("%d %d %d",&u,&v,&cost);if(e[u][v]>cost){e[u][v]=e[v][u]=cost;}}Bellman_ford(1,n);cout<<dist[n]<<endl;}return 0;
}
方法二:Floyd()算法#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
struct node{int u,v,w;
}num[maxx];
int dist[maxx];
int cnt;
int n,m;
int e[maxx][maxx];
void Floyd(int n){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){e[i][j]=min(e[i][j],e[i][k]+e[k][j]);}}}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){e[i][j]=inf;}}for(int i=1;i<=m;i++){int u,v,cost;scanf("%d %d %d",&u,&v,&cost);if(e[u][v]>cost){e[u][v]=e[v][u]=cost;}}Floyd(n);cout<<e[1][n]<<endl;}return 0;
}
HDU2544(Bellman-ford算法和Floyd算法)相关推荐
- 最短路径Dijkstra算法和Floyd算法整理、
转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径-Dijkstra算法和Floyd算法 Dijks ...
- 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法
第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...
- DP之Warshall算法和Floyd算法
DP之Warshall算法和Floyd算法 上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等. 然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最 ...
- 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...
- 最短路径(Dijkstra算法和Floyd算法)
最短路径 在图中,不可避免要解决的一个问题就是计算两点之间的最短路径,对于图结构来说,两个点之间不一定只有一条路径,那么如何才能找出最短的那一条就是图中最短路径问题.最短路径问题在实际生活中应用十 ...
- Dijkstra算法和Floyd算法详解(MATLAB代码)
一.Dijkstra算法 1.算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法.算法解决的是有 ...
- 最短路径—Dijkstra算法和Floyd算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 最短路径:Dijkstra算法和Floyd算法
一.Dijkstra算法(单个顶点到其他顶点的最短距离) 定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...
- dijkstra算法和floyd算法(C语言)
dijkstra算法: /* 邻接表存储 - 无权图的单源最短路算法 *//* dist[]和path[]全部初始化为-1 */ void Unweighted ( LGraph Graph, int ...
最新文章
- JSONObject没有fromObject方法(Json lib 库的使用)
- 刘政:别着急颠覆传统数据分析人才培养,先将落脚点放在实处
- 添加和删除行的能力table(能够编辑的表的内容)
- Python 操作Word文档插入图片和表格实例演示
- Vue.js(一) Vue.js + element-ui 扫盲
- 【类】变量复用,函数复用
- 你们觉得很可笑,但是很多人信的,真的很多很多。。
- 芋道 spring security oauth2 入门_Spring官方宣布:新的Spring OAuth2.0授权服务器已经来了
- PagerSwitch tab样式加上下拉刷新(一)
- 【高斯消元】BZOJ3503 [Cqoi2014]和谐矩阵
- 3. Ubuntu LAMP 环境搭建
- aiml简介+源代码解析+中文分词(java)
- 椭球拟合的电子罗盘磁差补偿_NXP传感器融合笔记09(地磁,干扰及校准,椭球拟合)...
- Arcface 总结
- CSDN日报190910:程序员都秃头,商务个个是人精
- 苹果电脑怎么自定义音频输出设备
- 王道程序员求职宝典 pdf
- Web前端低代码介绍的ppt大纲
- 一次服务器上g1回收器发生fullgc的粗浅理解与记录
- CTP的交易指令类型
热门文章
- PS2019历史记录画笔工具、历史记录艺术画笔工具
- Django博客系统(推荐文章数据展示)
- 所谓移动IP是指(58);实现移动IP的关键技术是(59)。【答案】D B
- 一文读懂CV中的注意力机制
- 熬了几个大夜,学完一套985博士总结的「卷积神经网络、目标检测、OpenCV」学习笔记(20G高清/PPT/代码)...
- 单镜头视觉系统检测车辆的测距方法
- 多摄像头实时目标跟踪和计数,使用YOLOv4,Deep SORT和Flask
- centos7.2安装mysql
- 整理一下自己手撸的博客
- Fastlane实战(一):移动开发自动化之道