最短路-dijkstra与floyd的邻接矩阵模板示例
2018-01-26 10:33
369 查看
/*测试数据 Input: 6 9 ABCDEF 0 2 4 0 3 28 1 0 2 1 4 10 2 1 15 2 5 8 4 3 4 5 4 18 5 3 13 Output: MGraph MAT(Dijkstra): 0 * 4 28 * * 2 0 * * 10 * * 15 0 * * 8 * * * 0 * * * * * 4 0 * * * * 13 18 0 D MAT(Dijkstra):0 19 4 25 29 12 P MAT(Dijkstra):-1 2 0 5 1 2 Output2: MGraph MAT(Floyd): 0 * 4 28 * * 2 0 * * 10 * * 15 0 * * 8 * * * 0 * * * * * 4 0 * * * * 13 18 0 DIST MAT(Floyd): 0 19 4 25 29 12 2 0 6 14 10 14 17 15 0 21 25 8 * * * 0 * * * * * 4 0 * * * * 13 18 0 PATH MAT(Floyd): -1 2 0 5 2 2 1 -1 0 4 1 2 1 2 -1 5 1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 4 -1 -1 -1 -1 -1 5 5 -1 */ #include<iostream> #include<cstdio> #define FINITY 999999 #define M 30 using namespace std; const int c=1;//代表有向图或无向图(0无向图1有向图) typedef char vertextype; typedef int edgetype; typedef struct { vertextype vex[M]; edgetype edges[M][M]; }Mgraph; int vn,en;//图的点数和边数 Mgraph g;//邻接矩阵构建的图 void creat(){//构建一张图 cin>>vn>>en; for(int i=0;i<vn;i++) for(int j=0;j<=i;j++) if(i==j)g.edges[i][j]=0; else g.edges[i][j]=g.edges[j][i]=FINITY; for(int i=0;i<vn;i++) cin>>g.vex[i]; for(int i=0;i<en;i++){ int a,b; edgetype v; cin>>a>>b>>v; g.edges[a][b]=v; if(c==0)g.edges[b][a]=v; } } int d[M];//用Dijkstra来求每个节点的最短路径 int dist[M][M];//使用Floyd记录多元最短路径 int p[M];//用Dijkstra来记录路径 int path[M][M];//用Floyd来记录路径 bool f[M];//表示该元素是否已经求出最短路径 void dijkstra(int v0){//dijikstra算法创建单元最短路径(邻接矩阵) int i,j,k,v,MIN,x; //初始化距离向量d for(v=0;v<vn;v++){ f[v]=false; d[v]=g.edges[v0][v]; if(d[v]<FINITY&&d[v]!=0) p[v]=v0; else p[v]=-1; } f[v0]=true;d[v0]=0; //依次找出n-1个节点加入集合中 for(i=1;i<vn;i++){ MIN=FINITY; for(k=0;k<vn;k++) if(!f[k]&&d[k]<MIN){ v=k; MIN=d[k]; } if(MIN==FINITY)return ; f[v]=true; //修改s与v-s中各节点的距离 for(k=0;k<vn;k++) if(!f[k]&&(MIN+g.edges[v][k]<d[k])){ d[k]=MIN+g.edges[v][k]; p[k]=v; } } } void floyd(){//floyd算法创建多元最短路径(邻接矩阵) int i,j,k; //初始化 for(i=0;i<vn;i++){ for(j=0;j<vn;j++){ dist[i][j]=g.edges[i][j]; if(i!=j&&dist[i][j]<FINITY)path[i][j]=i; else path[i][j]=-1; } } //递推求每一对顶点的最短路 for(k=0;k<vn;k++){ for(i=0;i<vn;i++) for(j=0;j<vn;j++) if(dist[i][j]>(dist[i][k]+dist[k][j])){ dist[i][j]=dist[i][k]+dist[k][j]; 4000 path[i][j]=k; } } } void print_dijkatra(){//测试函数(查看d,p数组中的内容) cout<<"MGraph MAT(Dijkstra):"<<endl; for(int i=0;i<vn;i++){ for(int j=0;j<vn;j++){ if(g.edges[i][j]==FINITY)printf("%-3c",'*'); else printf("%-3d",g.edges[i][j]); } cout<<endl; } cout<<"D MAT(Dijkstra):"; for(int i=0;i<vn;i++){ printf("%-3d",d[i]); } cout<<endl; cout<<"P MAT(Dijkstra):"; for(int i=0;i<vn;i++){ printf("%-3d",p[i]); } cout<<endl; } void print_floyd(){//测试函数(查看d,p数组中的内容) cout<<"MGraph MAT(Floyd):"<<endl; for(int i=0;i<vn;i++){ for(int j=0;j<vn;j++){ if(g.edges[i][j]==FINITY)printf("%-3c",'*'); else printf("%-3d",g.edges[i][j]); } cout<<endl; } cout<<"DIST MAT(Floyd):"<<endl; for(int i=0;i<vn;i++){ for(int j=0;j<vn;j++) if(dist[i][j]==FINITY)printf("%-3c",'*'); else printf("%-3d",dist[i][j]); cout<<endl; } cout<<"PATH MAT(Floyd):"<<endl; for(int i=0;i<vn;i++){ for(int j=0;j<vn;j++) printf("%-3d",path[i][j]); cout<<endl; } } int main(){ creat(); dijkstra(0); print_dijkatra(); floyd(); print_floyd(); return 0; }输出示例:
相关文章推荐
- 最短路-dijkstra与floyd的邻接矩阵模板示例
- 最短路-dijkstra与floyd的邻接矩阵模板示例
- 最短路-dijkstra与floyd的邻接矩阵模板示例
- HDOJ2544 最短路(Dijkstra,floyd,模板)
- Dijkstra单源最短路,邻接矩阵形式(模板)
- 【数据结构】有向图、无向图以及最短路(Dijkstra, Floyd)算法的C#实现(纯模板Template实现)
- [模板]最短路 (Floyd, Spfa, Dijkstra,
- 最短路(floyd/dijkstra/bellmanford/spaf 模板)
- 最短路模板 floyd+dijkstra+spfa
- hdu-2544-最短路(Dijkstra + Dijkstra优先队列 + Bellman-ford + SPFA +Floyd) 纯模板题
- 最短路 floyd dijkstra 模板
- ACM_最短路模板(SPFA,Dijkstra,Floyd)
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- Hdu 2544 最短路 (Dijkstra+SPFA+Floyd模板)
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- 【原创】最短路模板 Floyd,优先队列优化dijkstra,SPFA
- 最短路模板 Dijkstra+Floyd+SPFA
- Floyd,Dijkstra,SPFA模板整理(以[HDU2544-最短路]为例 )
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍