最短路径-Bellman Ford算法
2021/7/16 14:06:12
本文主要是介绍最短路径-Bellman Ford算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
最短路径-Bellman Ford算法
这里采用邻接矩阵实现Bellman Ford算法;可以参考blog;
限于时间,暂时只写下代码,以后有时间补上…
代码
- 采用邻接矩阵,代码没有通过,不清错错在哪边,如果有大佬发现错误,欢迎留言我的邮箱ycqnfz@gmail.com
感觉用边节点表示比较简单…
#include<iostream> #include<cstring> #define clr(x) memset(x,0,sizeof(x)) #define maxn 1000+5 using namespace std; const int maxint=1<<(sizeof(int)*8-1)-1; int n,m,k; //点数,边数 int mp[maxn][maxn]; int dis[maxn],path[maxn]; void chushihua() { cin>>n>>m>>k; for(int i=0; i<=n; i++) for(int j=1; j<=n; j++) mp[i][j]=maxint; for(int i=0; i<m; i++) { int v1,v2,w; cin>>v1>>v2>>w; mp[v1][v2]=w; } } //Bellman Ford算法 bool solve(int s,int t) { for(int i=1; i<=n; i++) { dis[i]=mp[s][i]; if(i!=s && dis[i]<maxint) path[i]=s; //当前不是起点并且可以到达,设前驱位起点s else path[i]=-1; } // for(int i=0;i<n;i++) cout<<path[i]<<" \t"<<dis[i]<<endl; for(int i=0; i<k-1; i++) { for(int u=1; u<=n; u++) { if(u==s) continue; for(int v=1; v<=n; v++) { if(mp[v][u]<maxint && dis[u]>dis[v]+mp[v][u]) { dis[u]=dis[v]+mp[v][u]; path[u]=v; } } } // for(int j=1; j<=n; j++) cout<<dis[j]<<" "; cout<<endl; // for(int j=1; j<=n; j++) cout<<path[j]<<" ";cout<<endl; } if(dis[t]>maxint/2) return false; //不可到t else return true; } int main() { chushihua(); if(solve(1,n)) cout<<dis[n]<<endl; else cout<<"impossible"<<endl; return 0; }
以下示例没有通过:
10 20 8
4 2 7
8 7 10
1 3 1
7 6 1
4 5 8
8 7 5
5 7 1
6 10 2
3 1 9
5 4 4
4 7 1
9 9 9
8 1 8
5 4 5
7 6 5
3 7 7
4 9 1
2 1 9
2 9 9
6 1 -2
11
- 采用边节点表示图仿写的代码,代码通过:
#include<iostream> #include<cstring> #define clr(x) memset(x,0,sizeof(x)) #define maxn 10000+5 using namespace std; const int maxint=1<<(sizeof(int)*8-1)-1; typedef struct Edge { int v1,v2; int w; void show() { cout<<"u="<<v1<<"\tv="<<v2<<"\tw="<<w<<endl; } } Edge; int n,m,k; Edge edges[maxn]; int dis[maxn],path[maxn]; void chushihua() { cin>>n>>m>>k; for(int i=1; i<=m; i++) { int v1,v2,wei; cin>>v1>>v2>>wei; edges[i].v1=v1; edges[i].v2=v2; edges[i].w=wei; } } bool solve(int s,int t) { for(int i=1; i<=n; i++) dis[i]=maxint; dis[s]=0; for(int i=0; i<k; i++) { int tmp[maxn]; for(int j=1; j<=n; j++) tmp[j]=dis[j]; for(int j=1; j<=m; j++) { int v1=edges[j].v1, v2=edges[j].v2, w=edges[j].w; if(dis[v2]>tmp[v1]+w) { // edges[j].show(); dis[v2]=tmp[v1]+w; path[v2]=v1; } } } if(dis[t]>=maxint/2) return false; else return true; } int main() { chushihua(); if(solve(1,n)) cout<<dis[n]<<endl; else cout<<"impossible"<<endl; return 0; }
2021-06-1 更新,感谢观看-
这篇关于最短路径-Bellman Ford算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南