//最短路径
/* dijkstra


Dijkstra(迪杰斯特拉)算法的核心思想是贪心策略+动态规划
http://www.programgo.com/article/4721147659/
Dijkstra算法能得出最短路径的最优解,但是效率低
*/
 

Floyed 算法:

  Floyed算法比较简单,其思想可以参照三角形的特性中,两边和与第三边的关系,a 和 b的最短路径要么是(a,b)要么是(a,c,b),这取决于 a->b和a->c->b的大小。

算法思想原理:

Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)

从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。

/* 用邻接矩阵表示的图的Dijkstra算法的源程序*/

#include <iostream>
using namespace std;
#define MAXVEX 100
#define MAX 1e+8
typedef char VexType;
typedef float AdjType; typedef struct
{
int n; //图的顶点个数
// VexType vexs[MAXVEX]; //顶点
AdjType arcs[MAXVEX][MAXVEX]; //边
}GraphMatrix; typedef struct {
// VexType vertex; //顶点信息
AdjType length; // 最短路径长度
int prevex; // 从v0到达vi(i=1,2,…n-1)的最短路径上vi的前驱顶点
}Path;
Path dist[]; // n为图中顶点个数 void dijkstra(GraphMatrix graph, Path dist[])
{
int i,j,minvex;
AdjType min; // 初始化,此时集合U中只有顶点v0
dist[].length = ; dist[].prevex = ;
graph.arcs[][] = ; // 表示顶点v0在集合U中 for(i = ; i < graph.n; i++)
{ // 初始化集合V-U中顶点的距离值
dist[i].length=graph.arcs[][i];
if (dist[i].length != MAX)
dist[i].prevex=;
else dist[i].prevex= -;
}
for(i = ; i < graph.n; i++)
{
min=MAX; minvex=;
for (j = ; j < graph.n; j++) //在V-U中选出距离值最小顶点
if( graph.arcs[j][j] == && dist[j].length < min )
{
min=dist[j].length; minvex=j;
}
if(minvex == ) break; // 从v0没有路径可以通往集合V-U中的顶点
graph.arcs[minvex][minvex] = ; // 集合V-U中路径最小的顶点为minvex
for (j = ; j < graph.n; j++)
{
// 调整集合V-U中的顶点的最短路径
if(graph.arcs[j][j] == ) continue;
if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j]) {
dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
dist[j].prevex = minvex;
}
}
}
} GraphMatrix graph; void initgraph(){
int i,j;
graph.n=;
for (i = ; i < graph.n; i++)
for (j = ; j < graph.n; j++)
graph.arcs[i][j] = (i == j ? : MAX);
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
graph.arcs[][] = ;
} int main(){
int i;
initgraph();
dijkstra(graph, dist);
for (i = ; i < graph.n; i++)
printf("(%.0f %d)\t", dist[i].length,dist[i].prevex);
system("pause");
return ;
}
//============================================================================
//Floyed: 往点中间插入其他点,动态:s[i][k] + s[k][j] < s[i][j]
//test case
/
//============================================================================ #include <iostream>
using namespace std;
int main()
{
int n,m,i,j,k,l,r;
cout<<"输入结点数和边数\n";
cin>>n>>m; int**s=new int*[n];//确定的是行数
for(int i=;i<n;i++)
{
s[i]=new int[n];//确定的是列数
}
//初始化,将自己与自己的距离置为0,任意两点距离置为99999
for(i=;i<n;i++){
for(j=;j<n;j++)
{ if(i==j) s[i][j]=;
s[i][j]=;
}
} //Input:
cout<<"输入结点和两个结点的权值\n";
for(k=;k<m;k++)
{
cin>>i>>j;
cin>>s[i][j];
} for (k=; k<n; k++)
for (i=; i<n; i++)
for (j=; j<n; j++)
if (s[i][k] + s[k][j] < s[i][j])
s[i][j] = s[i][k] + s[k][j];
cout<<"输入起始和终止结点"<<endl;
cin>>l>>r;
cout<<s[l][r]<<endl;
system("pause");
return ;
}
* */

图的最短路径:Dijkstra 和 Floyd的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  3. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  4. 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)

    做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...

  5. 图的最短路径Dijkstra

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...

  6. 数据结构与算法-图的最短路径Dijkstra

    一  无向图单源最短路径,Dijkstra算法 计算源点a到图中其他节点的最短距离,是一种贪心算法.利用局部最优,求解全局最优解. 设立一个visited访问和dist距离数组,在初始化后每一次收集一 ...

  7. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

  8. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  9. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

随机推荐

  1. 问题解决 Visual Studio 2015 无法复制文件“D:\swapfile.sys”

    莫名其妙的问题..度娘 必应统统不给力.. 还是找了谷大爷 严重性 代码 说明 项目 文件 行 列 类别 源 项目级别 工具 禁止显示状态错误 无法复制文件“D:\swapfile.sys”,原因是找 ...

  2. php session小节

    1.为什么要用session? 在人们访问网站的时候,有很多个网页,由于http自身的特点,用户每执行一个脚本都需要和web服务器重新建立连接.由于他们之间是无状态的,这次的连接无法得到上次连接的状态 ...

  3. IOS 计算文字尺寸(UILabel)

    方式1 :普通用法 #define  MJNameFont [UIFont systemFontOfSize:14] /** * 计算文字尺寸 * * @param text 需要计算尺寸的文字 * ...

  4. eplise一键集成工具

    因为要做平台,后台的内容就由我负责,目前想让测试人员  在本地使用eplise可以进行脚本开发,但是很多人都死在了搭建环境的道路上,那我就做了一键集成,点击就可以把所需要的配置项进行配置,总结:实际就 ...

  5. java注解总结-关联信息-关联结构

    java的注解是一种可配置信息: 这些信息直接依附在功能代码之上: * 元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于 ...

  6. 在线文本编辑器cheditor应用实例

    CKEditor 即 FCKEDITOR . FCKeditor是眼下最棒的可见就可以得网页编辑器之中的一个,它採用JavaScript编写.具备功能强大.配置easy.跨浏览器.支持多种编程语言.开 ...

  7. HDU(1754),线段树,单点替换,区间最值

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include < ...

  8. DP上课覆盖知识点,POJ(1513)

    题目链接:http://poj.org/problem?id=1513 解题报告: 思路: 知识点从第二个开始扫,递推表达式是:minlec[i]=min(minlec[k])+1,并且要保证,tim ...

  9. 1.1 NBU基本概念

    1.1 NBU基本概念 1) Policy(备份策略) 备份策略定义一台或几台服务器的备份方法.它包括哪些服务器需要备份.备份哪些目录或文件.在什么时间备份.采用什么方式进行备份等.配置NBU主要指定 ...

  10. 【转】使用webmagic搭建一个简单的爬虫

    [转]使用webmagic搭建一个简单的爬虫 刚刚接触爬虫,听说webmagic很不错,于是就了解了一下. webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代 ...