考研最路径dijkstra和floyd
先来讲个段子:为什么 Dijkstra 不能提出 floyd 算法?因为他的名字是 ijk 而不是 kij。
get不到点没有关系。我们今天的任务是看懂这个笑话。
dijkstra 的效率是n^2.处理的是一个点到所有点的最短路径。而floyd效率n^3,处理的是任意点的最短距离。dijkstra如果要处理任意点。
Dijkstra单源最短路算法(无法解决带负边问题):
单源就是由一到多,或由多到一,就是起点和终点至少有一个为一,若均大于1则为多源,求多源最短路时使用Dijkstra算法需要进行多次操作。
普通:
图的建立(就是把输入的路线储存起来):用邻接矩阵。
首先要进行初始化,将每个点到起点的距离设为一个较大的数,并将所有的点都标记为未访问过。
就是由起点开始,标记起点已经访问过,并将起点到起点的距离更新为0,遍历每一个可以走到的点,更新他们到起点的距离,然后找出未访问过的距离起点最近的点,因为它已经是为访问过的点中最近的点,所以从别的点来到这一点一定会比现在要远,所以它此时已经是最近的点了,然后再把它看作是出发点,再次进行上述操作(在更新距离是要先判断新距离是否比久距离要来得近,若比原来的远则不更新距离),最后没有未访问过的点或剩余点到出发点的距离均为无穷远则结束操作。
在更新距离时可以顺便更新前驱,就能够记录路径,不过一般题目都会有多条路径,在记录时要注意题目要求。
时间复杂度:O(n^2) ,因为要先对每个节点进行遍历,更新路径,然后还要找出所有未访问节点中最近的点,最差的情况就是要将n个点均进行操作,操作次数就是(2n)*n。
优先队列优化(堆优化):
优化主要就是缩短了查找未被访问的节点中最近的节点的时间,用优先队列来完成。
从起点出发遍历所有点,若距离缩短则将其加入队列中,结束后队列首则为下一点。当队列首元素中保存的点和存入时的距离大于此时该点对应距离时,将其跳过。
Floyd多源最短路径算法(无法解决带负边问题):
有一些动态规划的思想,利用中介点。dist[i][j] = min(dist[i][k]+dist[k][j],dist[i][j]);
当有下一点l 作为中介点时,A到B的距离就有五种种选择设上一中介点为C 这一中介点为D。A-B \ A-C-B \ A-D-B \ A-D-C-B \ A-C-D-B 。而D-C-B和A-C-D在上次以C为中介点就已经算出,D-B = min(D-C-B,D,B),A-C-D同理,然后就是不断的重复,把所有点做中介点一次就完成了。
核心代码:
for(int k=1;k<=n;i++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dist[i][j] = min(dist[i][k]+dist[k][j],dist[i][j]);
}
}
}
int dijkstra(Mgraph g,int path[],int dis[],int v)
{
int set[maxSize];
for(int i=0;i<g.n;i++)
{
set[i]=0;
dis[i]=g.edge[v][i];
if(g.edge[v][i]<inf)
path[i]=v;
else
path[i]=-1; }
set[v]=1;
path[v]=-1;
for(int i=0;i<g.n-1;i++)
{
int k=-1,min=inf;
for(int j=0;j<g.n;j++)
{
if(dis[j]<min&&set[j]==0)
{
min=dis[j];
k=j;
}
}
set[k]=1;
for(int j=0;j<g.n;j++)
{
if(set[j]==0&&dis[j]>dis[k]+g.edge[k][j])
{
dis[j]=dis[k]+g.edge[k][j];
path[j]=k;
}
} } }
void printPath(int u,int path[])
{
int stack[maxSize];
int top=-1;
while(path[u]!=-1)
{
stack[++top]=u;//这个是是u不是path[u],终点也要进来。
u=path[u];
}
stack[++top]=u;//最后一个==-1的点
while(top!=-1)
{
cout<<stack[top--]<<" ";
cout<<endl;
}
}
void floyd(Mgraph g,int path[][maxSize])
{
int map[maxSize][maxSize];
for(int i=0;i<g.n;i++)
for(int j=0;j<g.n;j++)
{
map[i][j]=g.edge[i][j];
path[i][j]=-1;
}
for(int k=0;k<g.n;k++)
for(int i=0;i<g.n;i++)
for(int j=0;j<g.n;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
path[i][j]=k;
} }
}
void printfpath(int u,int v,int path[][maxSize])
{
if(path[u][v]==-1)
cout<<u<<"——"<<v<<" ";
else
{
int mid=path[u][v];
printfpath(u,mid,path);
printfpath(mid,v,path);
}
}

这就是为什么folyd为什么是kij的循环。
考研最路径dijkstra和floyd的更多相关文章
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍
这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...
- 最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)
当然,这篇文章是借鉴大佬的... 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下... 1.Dijkstra(权值非负,适用 ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- ACM学习之路___HDU 1385(带路径保存的 Floyd)
Description These are N cities in Spring country. Between each pair of cities there may be one trans ...
- 最短路 dijkstra and floyd
二:最短路算法分析报告 背景 最短路问题(short-path problem):若网络中的每条边都有一个数值(长度.成本.时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路 ...
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...
- Algorithm --> Dijkstra和Floyd最短路径算法
Dijkstra算法 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必 ...
- 求最短路径的三种算法: Ford, Dijkstra和Floyd
Bellman-Ford算法 Bellman-Ford是一种容易理解的单源最短路径算法, Bellman-Ford算法需要两个数组进行辅助: dis[i]: 存储顶点i到源点已知最短路径 path[i ...
- 最短路算法详解(Dijkstra,Floyd)
最短路径 在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...
随机推荐
- 2021年首届.NET线下沙龙上海站 - 2021 .NET Meetup in Shanghai
.NET Conf 2020 刚刚在苏州落下帷幕, .NET 开发者们的热情不减,来自五湖四海的朋友一起参加疫情之下的 .NET 盛会. 2021年上海第一场线下活动就要来了,快来加入我们一起学习.N ...
- es6语法详解
什么是ECMAScript? ECMAScript是浏览器脚本语言的规范,而我们熟知的js语言,如JavaScript则是规范的具体实现.es6就好比Java的jdk. 一.es6语法详解:let声明 ...
- MVC和MTV框架模式
1. MVC: MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- widnows2008双网卡双ip不同Ip段
机房内有不同段ip,因为线路不一样,比如普通带宽和cn2带宽,现有需求配置双网卡双ip ip1: 121.7*.*.* 255.255.255.192 121.7*.*129 ip2: 103.11 ...
- (014)每日SQL学习:oracle下lag和lead分析函数
/*语法*/ lag(exp_str,offset,defval) over() Lead(exp_str,offset,defval) over() --exp_str要取的列 --offset取偏 ...
- Python程序中#-*-coding: UTF-8 -*-的作用
1.通常我们在pycharm中写程序的时候会加上#-*coding: UTF-8 -*- 如: #!/usr/bin/env python3#-*-coding: UTF-8 -*-#Author x ...
- BootstrapValidator验证规则、BootStrap表格:列参数
BootstrapValidator验证规则 需引用组件 <script src="~/Scripts/jquery-1.10.2.js"></script> ...
- jackson学习之五:JsonInclude注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具
ShowDoc,APIDoc,可道云API,语雀-适合IT企业的文档工具 一.ShowDoc官方文档及说明 1.1 它可以用来做什么 1.2 它都有些什么功能 1.3 使用在线的ShowDoc 1.4 ...
- login shell 和 non-login shell 的相关问题
问题:通过su命令切换用户并没有进入该用户的shell环境.这是为什么? 要解决这个问题,我们必须清楚用login shell 和non-login shell的区别. login sh ...