图的最短路径:Dijkstra 和 Floyd
//最短路径
/* 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的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 图的最短路径——dijkstra算法和Floyd算法
dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...
- 图的最短路径-----------Dijkstra算法详解(TjuOj2870_The Kth City)
做OJ需要用到搜索最短路径的题,于是整理了一下关于图的搜索算法: 图的搜索大致有三种比较常用的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 Dijkst ...
- 图的最短路径Dijkstra
#include <stdio.h> #include <string.h> #include <vector> #include <queue> #i ...
- 数据结构与算法-图的最短路径Dijkstra
一 无向图单源最短路径,Dijkstra算法 计算源点a到图中其他节点的最短距离,是一种贪心算法.利用局部最优,求解全局最优解. 设立一个visited访问和dist距离数组,在初始化后每一次收集一 ...
- C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)
1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 最短路径—Dijkstra算法和Floyd算法【转】
本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...
随机推荐
- 《孵化Twitter》:Twitter创始人勾心斗角史,细节披露程度令人吃惊
本书详细讲述twitter的发展史.感觉基本上是一部创始人从朋友变敌人,勾心斗角的历史.Twitter本身的产品发展反而相对比较简单. 书中披露了许多email.谈话.会议的细节,作者说这些是数百个小 ...
- DOM笔记(十三):JavaScript的继承方式
在Java.C++.C#等OO语言中,都支持两种继承方式:接口继承和实现继承.接口继承制继承方法签名,实现继承则继承实际的方法和属性.在SCMAScript中,由于函数没有签名,所以无法实现接口继承, ...
- javascript当中的无限分类
var data = [ {id:100000, name :"1", pid :0}, {id:100100, name :"1-1", pid :10000 ...
- numpy中的inf
numpy中的inf表示一个无限大的正数 import numpy x = numpy.inf x>9999999999999999999 结果为: True
- MySQL游标(cursor) 定义及使用
概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果 ...
- .net core自定义特性操作
最近移植之前写的几个类,发现特性操作发生了一些改变. 直接看代码,建立表和字段特性类,添加一个用户表,设置好特性. using System; namespace TestDemo { /// < ...
- 深入浅出:了解JavaScript中的call,apply,bind的差别
在 javascript之 this 关键字详解文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变 ...
- datatable中reload和load的区别
ajax.reload()用于datatable表某个数据的变化而重新加载 ajax.url(url).load() 用于切换url时,datatable重新获取数据,加载.
- 微信小程序开发入门学习(1):石头剪刀布小游戏
从今天起开始捣鼓小程序了2018-12-17 10:02:15 跟着教程做了第一个入门实例有兴趣的朋友可以看看: 猜拳游戏布局 程序达到的效果 猜拳游戏的布局是纵向显示了三个组件:文本组件(tex ...
- nuxt generate静态化后回退问题
之前线上的项目是nuxt build后的项目发布在服务器上,pm2来管理node的进程,nuxt还是运行在node的环境里. 这个方案用了半年左右,访问速度什么的确实很快,pm2管理下的node在wi ...