算法导论25(所有结点对的最短路径问题)
来源:互联网 发布:淘宝低价引流 编辑:程序博客网 时间:2024/05/17 21:57
25.1最短路径和矩阵乘法
#include<iostream> using namespace std; #define n 20 int L[n][n],M[n][n]; typedef struct { int VNum,ENum; int w[n][n]; }Graph; void create_graph(Graph &G) { int i,j,v1,v2; cin>>G.VNum>>G.ENum; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)G.w[i][j]=10000; } for(i=0;i<G.VNum;i++)G.w[i][i]=0; for(i=0;i<G.ENum;i++) { cin>>v1>>v2>>j; G.w[v1][v2]=j; } } int min(int a,int b) { return a<b?a:b; } void extend_shortest_paths(Graph G) { int i,j,k; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++) { M[i][j]=L[i][0]+G.w[0][j]; for(k=1;k<G.VNum;k++)M[i][j]=min(M[i][j],L[i][k]+G.w[k][j]); } } for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)L[i][j]=M[i][j]; } } void slow_all_pairs_shortest_paths(Graph G) { int i,j; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)L[i][j]=G.w[i][j]; } for(i=1;i<=G.VNum-2;i++)extend_shortest_paths(G); } int main() { int i,j; Graph G; create_graph(G); slow_all_pairs_shortest_paths(G); cout<<"++++++++++++++++++++"<<endl; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)cout<<L[i][j]<<' '; cout<<endl; } return 0; }
#include<iostream> using namespace std;#define n 20 int L[n][n],M[n][n];typedef struct { int VNum,ENum; int w[n][n];}Graph; void create_graph(Graph &G) { int i,j,v1,v2; cin>>G.VNum>>G.ENum; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)G.w[i][j]=10000; } for(i=0;i<G.VNum;i++)G.w[i][i]=0; for(i=0;i<G.ENum;i++) { cin>>v1>>v2>>j; G.w[v1][v2]=j; } } int min(int a,int b){ return a<b?a:b;}void extend_shortest_paths(Graph G){ int i,j,k; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++) { M[i][j]=L[i][0]+L[0][j]; for(k=1;k<G.VNum;k++)M[i][j]=min(M[i][j],L[i][k]+L[k][j]); } } for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)L[i][j]=M[i][j]; }}void faster_all_pairs_shortest_paths(Graph G){ int i,j,m=1; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)L[i][j]=G.w[i][j]; } while(m<G.VNum-1) { extend_shortest_paths(G); m*=2; }}int main() { int i,j; Graph G; create_graph(G); faster_all_pairs_shortest_paths(G); cout<<"++++++++++++++++++++"<<endl; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)cout<<L[i][j]<<' '; cout<<endl; } return 0; }25.2Floyd-Warshall算法
#include<iostream> using namespace std; #define n 20 int d[n][n]; typedef struct { int VNum,ENum; int w[n][n]; }Graph; void create_graph(Graph &G) { int i,j,v1,v2; cin>>G.VNum>>G.ENum; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)G.w[i][j]=10000; } for(i=0;i<G.VNum;i++)G.w[i][i]=0; for(i=0;i<G.ENum;i++) { cin>>v1>>v2>>j; G.w[v1][v2]=j; } } int min(int &a,int &b) { return a<b?a:b; } void Floyd_Warshall(Graph G) { int i,j,k; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)d[i][j]=G.w[i][j]; } for(k=0;k<G.VNum;k++) { for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } int main() { int i,j; Graph G; create_graph(G); Floyd_Warshall(G); cout<<"++++++++++++++++++++"<<endl; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)cout<<d[i][j]<<' '; cout<<endl; } return 0; }
25.3用于稀疏图的Johnson算法
#include<iostream> using namespace std;#define n 20 int dist1[n],dist2[n],d[n],D[n][n];typedef struct ENode { int v,w; ENode *next;}ENode; typedef struct VNode{ int u; ENode *next;}VNode;typedef struct{ int VNum,ENum; VNode Adj[n];}Graph;void create_graph(Graph &G) { int i,j,v1,v2; cin>>G.VNum>>G.ENum; for(i=0;i<G.VNum;i++) { G.Adj[i].u=i; G.Adj[i].next=NULL; } for(i=0;i<G.ENum;i++) { cin>>v1>>v2>>j; ENode *p=(ENode *)malloc(sizeof(ENode)); p->v=v2; p->w=j; p->next=G.Adj[v1].next; G.Adj[v1].next=p; } } void initialize_single_source1(Graph G,int s) { for(int i=0;i<G.VNum;i++)dist1[i]=10000; dist1[s]=0; } void relax1(int u,int v,int w) { if(dist1[u]+w<dist1[v])dist1[v]=dist1[u]+w; } bool Bellman_Ford(Graph G,int s) { int i,j; initialize_single_source1(G,s); for(i=1;i<G.VNum;i++) { for(j=0;j<G.VNum;j++) { ENode *p=G.Adj[j].next; while(p) { relax1(G.Adj[j].u,p->v,p->w); p=p->next; } } } for(j=0;j<G.VNum;j++) { ENode *p=G.Adj[j].next; while(p) { if(dist1[G.Adj[j].u]+p->w<dist1[p->v])return false; p=p->next; } } return true; } void initialize_single_source2(Graph G,int s) { for(int i=0;i<G.VNum;i++)dist2[i]=10000; dist2[s]=0; } void relax2(int u,int v,int w) { if(dist2[u]+w<dist2[v]) { dist2[v]=dist2[u]+w; d[v]=dist2[v]; } } void Dijkstra(Graph G,int s) { int i,j,k,min; initialize_single_source2(G,s); for(i=0;i<G.VNum;i++)d[i]=dist2[i]; for(i=0;i<G.VNum;i++) { min=d[0],j=0; for(k=1;k<G.VNum;k++) { if(d[k]<min) { min=d[k]; j=k; } } d[j]=10001; ENode *p=G.Adj[j].next; while(p) { relax2(G.Adj[j].u,p->v,p->w); p=p->next; } } } void Johnson(Graph G){ int i,j; Graph H=G; H.Adj[G.VNum].u=G.VNum; H.Adj[G.VNum].next=NULL; for(i=0;i<G.VNum;i++) { ENode *p=(ENode *)malloc(sizeof(ENode)); p->v=i; p->w=0; p->next=H.Adj[G.VNum].next; H.Adj[G.VNum].next=p; } H.VNum++; if(!Bellman_Ford(H,G.VNum))cout<<"the input graph contains a negative-weight cycle"<<endl; else { for(i=0;i<=G.VNum;i++) { ENode *p=H.Adj[i].next; while(p) { p->w=p->w+dist1[i]-dist1[p->v]; p=p->next; } } H.VNum--; for(i=0;i<G.VNum;i++) { Dijkstra(H,i); for(j=0;j<G.VNum;j++)D[i][j]=dist2[j]+dist1[j]-dist1[i]; } }}int main() { int i,j; Graph G; create_graph(G); Johnson(G); cout<<"++++++++++++++++++++"<<endl; for(i=0;i<G.VNum;i++) { for(j=0;j<G.VNum;j++)cout<<D[i][j]<<' '; cout<<endl; } return 0; }
0 0
- 算法导论25(所有结点对的最短路径问题)
- 算法导论第25章 所有结点对的最短路径问题Floyd等
- 算法导论 | 第25章 所有结点对的最短路径问题
- 【算法导论笔记】所有结点对的最短路径问题
- 算法导论第二十五章-所有结点对的最短路径问题-Cpp代码实现
- 《算法导论》笔记(13) 单源最短路径,所有结点对的最短路径
- 算法导论 所有结点最短路径问题 Johnson
- 所有结点对最短路径问题(Floyd-Warshall算法)——算法导论学习笔记(1)
- 《算法导论》笔记(17) 所有结点对最短路径 部分习题
- 算法导论笔记:25所有节点对的最短路径问题
- 算法导论 所有节点对的最短路径
- 所有结点对的最短路径问题之Johnson算法
- Floyd-Warshall算法求解所有结点对的最短路径问题Java实现
- 算法导论 第二十五章 所有节点对的最短路径问题
- 算法导论 所有节点对的最短路径问题 矩阵法
- 算法导论 所有节点对的最短路径问题 FloydWarshall
- 第25章:所有结点对的最短路径问题—floyd-warshall和Johnson算法
- 动态规划之所有点对的最短路径问题(Floyd算法)
- 网络编程I/O函数介绍
- POJ 2724 Purifying Machine(最大独立集)
- GCD 基础用法
- [概率+对数优化] hdu 4465 Candy
- 透彻理解块级元素的宽度
- 算法导论25(所有结点对的最短路径问题)
- 微信第三方登录无法回调到onResp方法中
- HDU 2141
- linux JDK配置 -bash: export: `/usr/lib/java': 不是有效的标识符
- 设置span的宽度
- Activity以各种方式启动Activity、状态保存,完全退出等
- linux shell join命令一定要把文件先sort,而且不能有空行否则后果很严重
- mac升级后php 扩展修复
- PL/SQL Developer中调试oracle的存储过程