文章目录

  • 最短路径问题
  • 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相关推荐

  1. 最短路径:Dijkstra、BellmanFord以及SPFA算法

    最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...

  2. 最短路径(Dijkstra、Bellman-Ford和SPFA算法)

    最短路径(Dijkstra.Bellman-Ford和SPFA算法) 前言 图的存储方式 邻接矩阵 邻接表 链表建立 利用vector 结构体 核心思路 Dijkstra算法 图解 基本思想 求解步骤 ...

  3. 最短路径--Floyd、Dijkstra、Bellman、SPFA算法

    前言 最短路径是数据结构-图中的一个经典问题,求解最短路径的问题,有四种算法,这四种算法各有各的不同,分别是: Floyd算法.Dijkstra算法.Bellman算法以及SPFA算法. 最常用的是前 ...

  4. 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

    图论算法之最短路径(Dijkstra.Floyd.Bellman-ford和SPFA) 1.图论最短路径概述 图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶 ...

  5. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...

  6. 最短路问题(Bellman/Dijkstra/Floyd)

    最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...

  7. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)

    图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...

  8. SPFA or bellman ford松弛法--单源最短路

    问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...

  9. 最短路径算法——Dijkstra and Floyd算法

    一.     前言:     这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...

  10. 图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )

    一.Dijkstra算法 问题描述:求一个点到任意个点的距离 思路:单源最短路径问题,使用Dijkstra算法 Input: 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 ...

最新文章

  1. pandas使用query函数删除dataframe中两个数据列加和小于某一特定值的数据行(removing rows based on multiple dataframe column value
  2. node.js require 自动执行脚本 并生成html,利用node.js实现自动生成前端项目组件的方法详解...
  3. 1.18 StringBuffer替换特殊字符
  4. org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
  5. 华南理工专科计算机随堂联系,华南理工大学网络教育计算机基础随堂练习第三章...
  6. Spring获取JavaBean的xml形式和注解形式
  7. Hadoop YARN配置参数剖析—RM与NM相关参数
  8. 通过 getResources 找不到jar包中的资源和目录的解决方法
  9. IE6 CSS bug: position:relative元素被overflow:auto/scroll元素包含
  10. 卸任后的马云“忙”坏了,健美大赛、蹦迪、修空调、种蘑菇,真相看懵了
  11. LinuxMint下的Orionode源码安装
  12. Confirm Hosts Registration with the server failed
  13. get buffer from CMSampleBufferRef
  14. python 日历+记事
  15. Android 修改zxing二维码样式
  16. 什么叫横向比较和纵向比较
  17. Python pip 安装与使用
  18. Arcgis Engine 面的创建和设置
  19. bochs运行xp_简单教程:Bochsxp镜像超级简化版安装教程
  20. 批量下载sra文件linux,Linux下从NCBI批量下载SRA数据的sra和aspera方法

热门文章

  1. 用对分法求解方程x^3-x^2-x-1=0
  2. html5 制作游戏
  3. Android NDK SO库隐藏内部符号表
  4. 学习:使用python+selenium实现路由器登陆账号密码爆破
  5. 【Si24R2F+ Demo板】介绍说明与使用建议
  6. 怎样设置电脑桌面共享计算机,局域网共享设置,小编教你电脑怎么设置局域网共享...
  7. jvm gc垃圾回收情况
  8. Email,电子邮箱免费注册流程
  9. iOS之获取手机DeviceToken,以及苹果测试推送工具Easy APNs Provider
  10. 计算机桌面文件夹不显示不出来的,如何隐藏文件夹别人都看不到