数据结构学习之弗洛伊德floyd算法求最短路径
2012-10-26 12:45
302 查看
#include "stdio.h" #include "stdlib.h" #define MAX 20 #define INFINITY 9999 typedef bool PathMatrix[MAX+1][MAX+1][MAX+1]; typedef int DistanceMatrix[MAX+1][MAX+1]; typedef struct { int vexnum,arcnum; char vexs[MAX+1]; int arcs[MAX+1][MAX+1]; }MGraph; void CreateDN(MGraph &G) { int i,j,k,v1,v2,w; printf("请输入顶点数和边数:"); scanf("%d %d",&G.vexnum,&G.arcnum); for(i=0;i<G.vexnum;i++) { getchar(); printf("请输入第%d个结点:",i); scanf("%c",&G.vexs[i]); } for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) G.arcs[i][j]=INFINITY; for(k=0;k<G.arcnum;k++) { printf("请输入边----源点,终点,权值:"); scanf("%d %d %d",&v1,&v2,&w); G.arcs[v1][v2]=w; } } void ShortestPath_FLOYD(MGraph G,PathMatrix &P,DistanceMatrix &D) { int v,w,u,i; for(v=0;v<G.vexnum;++v) for(w=0;w<G.vexnum;++w) { D[v][w]=G.arcs[v][w]; for(u=0;u<G.vexnum;++u) P[v][w][u]=false; if (D[v][w]<INFINITY) { P[v][w][v]=true; P[v][w][w]=true; } } for(u=0;u<G.vexnum;++u) for(v=0;v<G.vexnum;++v) for(w=0;w<G.vexnum;++w) if (D[v][u]+D[u][w]<D[v][w]) { D[v][w]=D[v][u]+D[u][w]; for(i=0;i<G.vexnum;++i) P[v][w][i]=P[v][u][i]||P[u][w][i]; } } void main() { MGraph G; int i,j,k; CreateDN(G); PathMatrix p; DistanceMatrix D; ShortestPath_FLOYD(G,p,D); for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) { printf("%c到顶点%c的最短路径为:\n",G.vexs[i],G.vexs[j]); for(k=0;k<G.vexnum;k++) printf("%d ",p[i][j][k]); printf("代价为:%d\n",D[i][j]); printf("\n"); } }
请输入顶点数和边数:5 7 请输入第0个结点:a 请输入第1个结点:b 请输入第2个结点:c 请输入第3个结点:d 请输入第4个结点:e 请输入边----源点,终点,权值:0 1 3 请输入边----源点,终点,权值:0 3 8 请输入边----源点,终点,权值:1 2 9 请输入边----源点,终点,权值:1 3 2 请输入边----源点,终点,权值:3 2 5 请输入边----源点,终点,权值:3 4 1 请输入边----源点,终点,权值:2 4 4
#include<stdlib.h> #include<stdio.h> #define INFINITY 1000 // 最大值 #define MAX_VERTEX_NUM 20 // 最大顶点个数 #define TRUE 1 #define FALSE 0 typedef enum{DG, DN, UDG, UDN} GraphKind; // 四种图类型 typedef struct MGraph{ char vexs[MAX_VERTEX_NUM]; // 顶点向量 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vexnum,arcnum; // 图的当前顶点数和弧数 GraphKind kind; // 图的种类标志 } MGraph; void find(int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph G,int a,int b); void main(){ MGraph G; int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM],P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int v,w,k,a,b,i; printf("请输入顶点数和弧数"); scanf("%d %d",&G.vexnum,&G.arcnum); G.kind=DG; printf("请输入邻接矩阵\n"); for (v = 0; v < G.vexnum; v++) for (w = 0; w < G.vexnum; w++) scanf("%d",&G.arcs[v][w]); //读入邻接矩阵 // P[v][w][k]为TRUE,则从v到w的最短路径中含有k节点 // D[v][w]从v到w的最短路径的长度 for (v = 0; v < G.vexnum; v++) for (w = 0; w < G.vexnum; w++){ D[v][w] = G.arcs[v][w]; for (k = 0; k < G.vexnum; k++) P[v][w][k] = FALSE; if (D[v][w] < INFINITY) P[v][w][v] = P[v][w][w] = TRUE; } for (k = 0; k < G.vexnum; k++) for (v = 0; v < G.vexnum; v++) for (w = 0; w < G.vexnum; w++) if (D[v][k] + D[k][w] < D[v][w]){ D[v][w] = D[v][k] + D[k][w]; for (i = 0; i < G.vexnum; i++) P[v][w][i] = P[v][k][i] || P[k][w][i]; } for(a=0; a<G.vexnum; a++) for(b=0; b<G.vexnum; b++) if(D[a][b] < INFINITY && a!=b){ printf("%c到%c最短路径为",65+a,65+b); printf("%c\t",65+a); find(P,G,a,b); printf("%c\t",65+b); printf("长度为%d",D[a][b]); printf("\n"); } } void find(int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph G,int a,int b){ int k; for(k = 0; k < G.vexnum; k++) if(P[a][b][k]==TRUE && k!=a && k!=b){ find(P,G,a,k); printf("%c\t",65+k); find(P,G,k,b); } }
请输入顶点数和弧数6 9
请输入邻接矩阵
0 3 1000 4 1000 5
1000 0 1 1000 1000 5
1000 1000 0 5 1000 1000
1000 3 1000 0 1000 1000
1000 1000
1000 3 0 2
1000 1000 1000 2 1000 0
A到B最短路径为A B 长度为3
A到C最短路径为A B C 长度为4
A到D最短路径为A D 长度为4
A到F最短路径为A F 长度为5
B到C最短路径为B C 长度为1
B到D最短路径为B C D 长度为6
B到F最短路径为B F 长度为5
C到B最短路径为C D B 长度为8
C到D最短路径为C D 长度为5
C到F最短路径为C D B D B F 长度为13
D到B最短路径为D B 长度为3
D到C最短路径为D B C 长度为4
D到F最短路径为D B F 长度为8
E到B最短路径为E D B 长度为6
E到C最短路径为E D B D B C 长度为7
E到D最短路径为E D 长度为3
E到F最短路径为E F 长度为2
F到B最短路径为F D B 长度为5
F到C最短路径为F D B D B C 长度为6
F到D最短路径为F D 长度为2
Press any key to continue
相关文章推荐
- 数据结构学习笔记 --- 图(最短路径)
- 数据结构 学习笔记(八):图(中):最短路径问题(单源最短路径 Dijkstra,多源最短路径 Floyd)
- Java数据结构----图--最短路径解法Dijkstra算法和Floyd算法
- 图结构练习——最短路径(floyd算法(弗洛伊德))
- Floyd算法学习(最短路径)
- 数据结构学习笔记 --- 图(最短路径)
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
- 数据结构学习记录-迷宫设计(最短路径)
- 数据结构 最短路径问题 Floyd算法
- 图的最短路径弗洛伊德Floyd算法
- 数据结构与算法15:单源最短路径弗洛伊德Floyd算法
- 数据结构-最短路径—Dijkstra算法和Floyd算法
- Java数据结构----图--最短路径解法Dijkstra算法和Floyd算法
- 数据结构_图_最短路径_弗洛伊德(Floyed)算法
- 数据结构-图-最短路径(1)迪杰斯特拉算法构造
- 最短路径—大话Dijkstra算法和Floyd算法
- Floyd算法求多源最短路径
- Floyd算法-寻求最短路径
- 最短路径—Dijkstra算法和Floyd算法
- 数据结构之 迪杰斯特拉最短路径算法