//最短路径
/* 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. pat甲级1107

    1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...

  2. Android(java)学习笔记63:Clock App 编写报错01

    1. 首先我们二话不说直接先看报错内容如下: 07-12 08:25:03.572: E/dalvikvm(3602): native fork pid:0 done. 07-12 08:25:03. ...

  3. HttpServletRequest request 获取form参数的两种方式

    @RequestMapping(value="/pay",method = RequestMethod.POST) public String buildRequest(HttpS ...

  4. 使用MongoDB 2.6 C++驱动中的连接池

    .post p{text-indent: 2em;} MongoDB2.6的CXX驱动(mongo-cxx-driver-26compat),内置包含了数据库连接池,方便管理数据库连接,但是官方文档说 ...

  5. No such file or directory 8356:error:02001003:system library:fopen:No such process:crypto\bio\bss_file.c:7 4:fopen

    使用OpenSSL生成证书,构建根证书前,需要构建随机数文件(.rand),命令如下: openssl rand - 报错如下: OpenSSL> rand - Can't open priva ...

  6. 记录表TABLE中 INDEX BY BINARY_INTEGER 的作用

    type my_number_arr is table of number index by binary_integer; 其作用是,加了”index by binary_integer ”后,my ...

  7. iOS 多线程 之 GCD(大中枢派发)(二)

    本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...

  8. Python 初始—(文件操作)

    文件修改,我们可以不用讲一个文件全部都进行读取,然后放入内存,如果文件过大,容易造成内存的 内存溢出问题 因此我们可以便读取边进行修改操作 f=open("old.txt",&qu ...

  9. Centos7下MySql5.7安装及配置

    安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...

  10. datatable中reload和load的区别

    ajax.reload()用于datatable表某个数据的变化而重新加载 ajax.url(url).load() 用于切换url时,datatable重新获取数据,加载.