最短路径——DFS、Dijkstra、Floyd、Bellman-Ford、spfa
文章目录
- 最短路径问题
- DFS
- Dijkstra
- floyd
- bellman_ford
- spfa
最短路径问题
求带权图中两点之间最短距离的问题
代码案例中的输入格式为
边数M 结点数N
边1的起始节点 边1的目的结点 边1的权重
…
边M的起始节点 边M的目的结点 边M的权重
例
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
题目:https://vjudge.net/problem/POJ-2387
DFS
原理:从源节点深度搜索最短路径
/*
* problem:最短路径
* method:dfs
* date:2020/08/12
*/
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<cmath>
#define ll long long
using namespace std;
const int inf=1e10;
const int maxn=1005;
int arc[maxn][maxn];
bool vis[maxn];
int mini;
int T,N,start,dest;
void init() {int i,j;for(i=0; i<N; i++) {for(j=0; j<N; j++) {if(i==j) arc[i][j]=0;else arc[i][j]=inf;}vis[i]=false;}mini=inf;
}
void dfs(int index,int minDis) {int i,j;if(index==dest) {mini=mini<minDis?mini:minDis;return;}if(minDis>mini) return;for(i=0; i<N; i++) {if(!vis[i]&&arc[index][i]!=inf) {vis[i]=true;dfs(i,minDis+arc[index][i]);vis[i]=false;}}
}
using namespace std;
int main() {int i,j;while(cin>>T>>N) {init();int a,b,c;for(i=0; i<T; i++) {cin>>a>>b>>c;a--;b--;if(arc[a][b]>c) {arc[a][b]=arc[b][a]=c;}}start=N-1;dest=0;vis[start]=true;dfs(start,0);cout<<mini<<endl;}return 0;
}
Dijkstra
原理:从源节点开始更新到可达结点的最短距离,贪心选择下一个结点进行更新
/*
* problem: 最短路径
* method:dijkstra
* date:2020/08/12
*/
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<cmath>
#define ll long long
using namespace std;
const int inf=1e9;
const int maxn=2005;
int arc[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int T,N,start,dest;
void init() {int i,j;for(i=0; i<N; i++) {for(j=0; j<N; j++) {if(i==j) arc[i][j]=0;else arc[i][j]=inf;}vis[i]=false;dis[i]=inf;}
}
void dijkstra(int u) {int i,j;dis[u]=0;int min;for(i=0; i<N; i++) {min=inf;for(j=0; j<N; j++) {if(!vis[j]&&dis[j]<min) {u=j;min=dis[j];}}vis[u]=true;for(j=0; j<N; j++) {if(!vis[j]&&arc[u][j]!=inf&&dis[u]+arc[u][j]<dis[j]) {dis[j]=dis[u]+arc[u][j];}}}
}
int main() {int i,j;while(cin>>T>>N) {init();int a,b,c;for(i=0; i<T; i++) {cin>>a>>b>>c;a--;b--;if(arc[a][b]>c) {arc[a][b]=arc[b][a]=c;}}start=N-1;dest=0;dijkstra(start);cout<<dis[dest]<<endl;}return 0;
}
floyd
原理:从0-N-1考虑两点间经过的结点数来确定两点间最短距离,最终求出了任意两点间距离
/*
* problem:最短路径
* method:floyd
* date:2020/08/12
*/
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<cmath>
#define ll long long
using namespace std;
const int inf=1e9;
const int maxn=2005;
int arc[maxn][maxn];
int T,N,start,dest;
void init() {int i,j;for(i=0; i<N; i++) {for(j=0; j<N; j++) {if(i==j) arc[i][j]=0;else arc[i][j]=inf;}}
}
int main() {int i,j;while(cin>>T>>N) {init();int a,b,c;for(i=0; i<T; i++) {cin>>a>>b>>c;a--;b--;if(arc[a][b]>c) {arc[a][b]=arc[b][a]=c;}}for(int k=0; k<N; k++) {for(i=0; i<N; i++) {for(j=0; j<N; j++) {if(arc[i][k]+arc[k][j]<arc[i][j]) {arc[i][j]=arc[i][k]+arc[k][j];}}}}start=N-1;dest=0;cout<<arc[start][dest]<<endl;}return 0;
}
bellman_ford
原理:从两点间距离看是遍历松弛两点间的距离,从点的角度看类似于广度优先搜索的dijkstra(dijkstra类似于深度优先搜索)
/*
* problem:最短路径
* method:bellman_ford
* date:2020/08/12
*/
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<cmath>
#define ll long long
using namespace std;
const int inf=1e9;
const int maxn=1005;
const int maxm=4005;
struct Edge {int u,v,w;
};
Edge e[maxm];
int dis[maxn];
int M,N,start,dest;
bool bellman_ford(int start) {int i,j;for(i=0; i<N; i++) {dis[i]=inf;}dis[start]=0;bool flag=false;for(i=0; i<N-1; i++) {flag=false;for(j=0; j<M; j++) {if(dis[e[j].v]>dis[e[j].u]+e[j].w) {dis[e[j].v]=dis[e[j].u]+e[j].w;flag=true;}}if(!flag) break;}for(i=0; i<M; i++) {if(dis[e[i].u]>dis[e[i].v]+e[i].w) {return false;}}return true;
}
int main() {int i,j;while(cin>>M>>N) {int a,b,c;for(i=0; i<M; i++) {cin>>a>>b>>c;a--;b--;e[i].u=a;e[i].v=b;e[i].w=c;e[i+M].v=a;e[i+M].u=b;e[i+M].w=c;}M*=2; //无向图边数需乘以2start=N-1;dest=0;if(bellman_ford(start) ) {cout<<dis[dest]<<endl;} else {cout<<"存在负权回路"<<endl;}}return 0;
}
spfa
原理:采用队列来对bellman-ford进行改进
/*
* problem:最短路径
* method:spfa
* date:2020/08/12
*/
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<cmath>
#define ll long long
using namespace std;
const int inf=1e10;
const int maxn=1005;
vector<int> to[maxn],weight[maxn];
bool vis[maxn];
int dis[maxn];
int T,N,start,dest;
void spfa(int start){int i,j;for(i=0;i<N;i++){dis[i]=inf;vis[i]=false;}dis[start]=0;vis[start]=true;queue<int> Q;Q.push(start);while(!Q.empty()){int u=Q.front();Q.pop();vis[u]=false;for(i=0;i<to[u].size();i++){int v=to[u][i],w=weight[u][i];if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;if(!vis[v]){vis[v]=true;Q.push(v);}}}}
}
int main(){int i,j;while(cin>>T>>N){int a,b,c;for(i=0;i<T;i++){cin>>a>>b>>c;a--;b--;to[a].push_back(b);weight[a].push_back(c);//无向图to[b].push_back(a);weight[b].push_back(c);}start=N-1;dest=0;spfa(start);cout<<dis[dest]<<endl;}return 0;
}
最短路径——DFS、Dijkstra、Floyd、Bellman-Ford、spfa相关推荐
- 最短路径:Dijkstra、BellmanFord以及SPFA算法
最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...
- 最短路径(Dijkstra、Bellman-Ford和SPFA算法)
最短路径(Dijkstra.Bellman-Ford和SPFA算法) 前言 图的存储方式 邻接矩阵 邻接表 链表建立 利用vector 结构体 核心思路 Dijkstra算法 图解 基本思想 求解步骤 ...
- 最短路径--Floyd、Dijkstra、Bellman、SPFA算法
前言 最短路径是数据结构-图中的一个经典问题,求解最短路径的问题,有四种算法,这四种算法各有各的不同,分别是: Floyd算法.Dijkstra算法.Bellman算法以及SPFA算法. 最常用的是前 ...
- 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)
图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...
- 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别
关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...
- 最短路问题(Bellman/Dijkstra/Floyd)
最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...
- 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)
图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...
- SPFA or bellman ford松弛法--单源最短路
问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...
- 最短路径算法——Dijkstra and Floyd算法
一. 前言: 这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...
- 图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )
一.Dijkstra算法 问题描述:求一个点到任意个点的距离 思路:单源最短路径问题,使用Dijkstra算法 Input: 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 ...
最新文章
- pandas使用query函数删除dataframe中两个数据列加和小于某一特定值的数据行(removing rows based on multiple dataframe column value
- node.js require 自动执行脚本 并生成html,利用node.js实现自动生成前端项目组件的方法详解...
- 1.18 StringBuffer替换特殊字符
- org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
- 华南理工专科计算机随堂联系,华南理工大学网络教育计算机基础随堂练习第三章...
- Spring获取JavaBean的xml形式和注解形式
- Hadoop YARN配置参数剖析—RM与NM相关参数
- 通过 getResources 找不到jar包中的资源和目录的解决方法
- IE6 CSS bug: position:relative元素被overflow:auto/scroll元素包含
- 卸任后的马云“忙”坏了,健美大赛、蹦迪、修空调、种蘑菇,真相看懵了
- LinuxMint下的Orionode源码安装
- Confirm Hosts Registration with the server failed
- get buffer from CMSampleBufferRef
- python 日历+记事
- Android 修改zxing二维码样式
- 什么叫横向比较和纵向比较
- Python pip 安装与使用
- Arcgis Engine 面的创建和设置
- bochs运行xp_简单教程:Bochsxp镜像超级简化版安装教程
- 批量下载sra文件linux,Linux下从NCBI批量下载SRA数据的sra和aspera方法
热门文章
- 用对分法求解方程x^3-x^2-x-1=0
- html5 制作游戏
- Android NDK SO库隐藏内部符号表
- 学习:使用python+selenium实现路由器登陆账号密码爆破
- 【Si24R2F+ Demo板】介绍说明与使用建议
- 怎样设置电脑桌面共享计算机,局域网共享设置,小编教你电脑怎么设置局域网共享...
- jvm gc垃圾回收情况
- Email,电子邮箱免费注册流程
- iOS之获取手机DeviceToken,以及苹果测试推送工具Easy APNs Provider
- 计算机桌面文件夹不显示不出来的,如何隐藏文件夹别人都看不到