数据结构与算法分析 - 最短路(Dijkstra+floyd_Warshall+bellman_ford)
先附上Djikstra的代码:普通版
const int maxn=101;
const int INF=0x3f3f3f3f;
int edges[maxn][maxn];
int dist[maxn];
void dijkstra(int s,int n){
bool done[maxn];
memset(done,0,sizeof(done));
done[s]=true;
for(int i=0;i<n;i++)
dist[i]=edges[s][i];
for(int i=0,min,u;i<n;i++){
min=INF;
for(int j=0;j<n;j++)
if(!done[j] && dist[j]<min){
min=dist[j];
u=j;
}
done[u]=true;
for(int j=0;j<n;j++){
if(dist[u]+edges[u][j]<dist[j])
dist[j]=dist[u]+edges[u][j];
}
}
}
2.Bellman-Ford 算法
优点:能处理包含负权边的图
//单源点最短路径 - Bellman-Ford算法 #define maxn 31
#define inf 0x3f3f3f3f
class edge{
public:
int from,to,cost;
edge(){
from=0,to=0,cost=0;
}
edge(int a,int b ,int c){
from=a,to=b,cost=c;
}
}; edge Edges[maxn];
int dist[maxn]; void init(){
for(int i=1;i<maxn;i++){
for(int j=1;j<maxn;j++){
if(i==j) Edges[i]=edge(i,j,1);
else Edges[i]=edge(i,j,inf);
}
}
} /*V:顶点数,E:边数*/
void bellman_ford(int s,int V,int E){
for(int i=0;i<V;i++)
dist[i]=inf;
dist[s]=0;
for(int i=1;i<=V;i++){
bool update=false;
for(int j=0;j<E;j++){
edge e=Edges[j];
if(dist[e.from]!=inf && dist[e.to]>dist[e.from]+e.cost){
dist[e.to]=dist[e.from]+e.cost;
update=true;
}
}
if(!update)break;
}
}
3.Floyd_Warshall算法
#define maxn 31
#define inf 0x3f3f3f3f
double edges[maxn][maxn];
void init(){
for(int i=1;i<maxn;i++)
for(int j=1;j<maxn;j++)
edges[i][j]=(i==j?1:inf);
} void floyd_warshall(int n){
for(int k=1;k<=n;k++){
for(int i=1,u;i<=n;i++){
for(int j=1;j<=n;j++){
if(edges[i][k]+edges[k][j]<edges[i][j])
edges[i][j]=edges[i][k]+edges[k][j];
}
}
}
}
数据结构与算法分析 - 最短路(Dijkstra+floyd_Warshall+bellman_ford)的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- hdu 2544 最短路 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- <数据结构与算法分析>读书笔记--最大子序列和问题的求解
现在我们将要叙述四个算法来求解早先提出的最大子序列和问题. 第一个算法,它只是穷举式地尝试所有的可能.for循环中的循环变量反映了Java中数组从0开始而不是从1开始这样一个事实.还有,本算法并不计算 ...
- <数据结构与算法分析>读书笔记--运行时间计算
有几种方法估计一个程序的运行时间.前面的表是凭经验得到的(可以参考:<数据结构与算法分析>读书笔记--要分析的问题) 如果认为两个程序花费大致相同的时间,要确定哪个程序更快的最好方法很可能 ...
- <数据结构与算法分析>读书笔记--数学知识复习
数学知识复习是<数据结构与算法分析>的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感.不过再怎么恐惧也是要面对的. 一.指数 基本公式: 二.对数 在计算机科学中除非有 ...
- [数据结构与算法分析(Mark Allen Weiss)]不相交集 @ Python
最简单的不相交集的实现,来自MAW的<数据结构与算法分析>. 代码: class DisjSet: def __init__(self, NumSets): self.S = [0 for ...
- [数据结构与算法分析(Mark Allen Weiss)]二叉树的插入与删除 @ Python
二叉树的插入与删除,来自Mark Allen Weiss的<数据结构与算法分析>. # Definition for a binary tree node class TreeNode: ...
- 数据结构与算法--最短路径之Dijkstra算法
数据结构与算法--最短路径之Dijkstra算法 加权图中,我们很可能关心这样一个问题:从一个顶点到另一个顶点成本最小的路径.比如从成都到北京,途中还有好多城市,如何规划路线,能使总路程最小:或者我们 ...
随机推荐
- ALinq Dynamic 使用指南——慨述(上)
一.使用 1.程序集与命名空间的引用使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq用户)或者System.Data.Linq.Dynamic.dll (Li ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- 使用 Eclipse 调试 Java 程序的技巧
你应该看过一些如<关于调试的N件事>这类很流行的帖子 .假设我每天花费1小时在调试我的应用程序上的话,那累积起来的话也是很大量的时间.由于这个原因,用这些时间来重视并了解所有使我们调试更方 ...
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- Yii 字段验证
关于验证的属性: $enableClientValidation:是否在客户端验证,也即是否生成前端js验证脚本(如果在form中设置了ajax验证,也会生成这个js脚本). $enableAjaxV ...
- 【Alpha版本】冲刺阶段——Day 9
我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...
- IOS中取乱序数据最大值、最小值方法
2016-01-12 / 23:15:58 第一种方法也是常规方法,就是设定一个默认值作为最大值,循环取比这个最大值还大的值并赋值给默认最大值,这样循环完成后这个默认最大值变量里面的值就是最大值了: ...
- linux系统数据落盘之细节
本文节选自这里,原文以mysql innodb系统为例,介绍了数据经过的各层级的buffer和cache,其它系统也有相似的原理,摘录于此. 3. VFS层 该层的缓冲都放在主机内存中,它的目的 ...
- DEDE列表页直接获取下载链接
我们得去设置软件频道的东西,先点击“核心”->"内容管理模型"中的软件模型进行编辑,将softlinks加入列表字段. 然后进入“系统”->"软件频道设置&q ...
- Java反编译插件JadClipse
Java反编译是很容易的,现在就介绍一个反编译插件,以后我们通过Ctrl+鼠标左键查看源码就容易得多了,不用再担心源码找不到了,配置过程很简单的. 准备: 1.下载JadClipse(jar文件,ec ...