考研最路径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.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...
随机推荐
- playwright自动化项目搭建
这是关于playwright系列介绍的最后一篇.搭建基于 playwright 的自动化项目. GitHub地址: https://github.com/defnngj/playwright-pro ...
- css animation @keyframes 动画
需求:语音播放动态效果 方案:使用如下图片,利用 css animation @keyframes 做动画 html <span class="horn" :class=& ...
- 转 Fiddler1 简单使用
Fiddler1 简单使用 文章转自:https://www.cnblogs.com/zhengna/p/9008014.html 1.Fiddler下载地址:https://www.tele ...
- cisco交换机路由器静态路由配置
一.切换模式 router>en //用户模式enable router#conf t //特权模式 ...
- Let’s Encrypt/Certbot移除/remove/revoke不需要的域名证书
1.首先确认你的证书不再需要,如果有必要,请执行下面的命令进行备份 cp /etc/letsencrypt/ /etc/letsencrypt.backup -r 2.撤销证书然后删除证书 [root ...
- jmeter进行分布式压测过程与 注意事项
jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...
- HTTP/1HTTP/2HTTP/3
https://mp.weixin.qq.com/s/fy84edOix5tGgcvdFkJi2w
- 博客-livevent-stl-cpp-nginx
https://blog.csdn.net/move_now/article/category/6420121
- 【Coursera】Internet History 读书笔记
前言 这个Internet History 有些令人劝退.电脑无法播放视频.手机不能播放.最后百度了改了hosts文件才可以. 附上解决方法: 解决coursera可以登录但无法播放视频 第一周 第三 ...
- Java 学习之路 -- day00
Java 学习之路 -- day00 Typora 快捷键操作 标题:#+空格 2. *斜体* 3. **加粗** 4. **斜体加粗*** 5. ~~删除线~~ 6. > 引用 7. ···分 ...