标签:缓存 size printf 位置 邻接矩阵 存储结构 har 清除 数据
以5 a b 7 a d 4 b c 2 b d 3 c a 3 c b 2 c d 1 d c构造有向图并找出每个顶点到其余顶点的最短路径
#include <stdio.h> #include <stdlib.h> #define MaxVertexNum 100 #define BIG 100 typedef char VertexType;//顶点节点的数据类型 typedef int EdgeType;//边权值的数据类型 typedef struct{ VertexType Vertex[MaxVertexNum];//顶点表 EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表 int vertexnum,arcnum;//顶点数和边数 }MGraph;//邻接矩阵的存储结构 int Locate(VertexType v){ if(v>=97){return (int)v-97;} else {return (int)v-65;} }//将顶点转换为相应的位置 void CreatGraph(MGraph &M){ EdgeType e; VertexType v1,v2; printf("输入节点数和边数:"); scanf("%d %d",&M.vertexnum,&M.arcnum); printf("输入节点:"); for(int i=0;i<M.vertexnum;i++){ getchar(); scanf("%c",&M.Vertex[i]); } for(int i=0;i<M.vertexnum;i++){ for(int j=0;j<M.vertexnum;j++){ M.Edge[i][j]=BIG; if(i==j){ M.Edge[i][j]=0; } } } fflush(stdin);//清除缓存,防止下一次的scanf()函数失效 printf("输入路径的权值及其两个节点:\n"); for(int i=0;i<M.arcnum;i++){ scanf("%d %c %c",&e,&v1,&v2); M.Edge[Locate(v1)][Locate(v2)]=e; } }//构造一个有向图 void PrintGraph(MGraph &M){ printf("邻接矩阵\n"); for(int i=0;i<M.vertexnum;i++){ printf(" %c ",M.Vertex[i]); for(int j=0;j<M.vertexnum;j++){ if(M.Edge[i][j]!=BIG){ printf("%d ",M.Edge[i][j]); } else{printf("∞ ");} } printf("\n"); } }//打印邻接矩阵 void visited(int v){ printf("%c ",v+‘a‘); }//访问当前节点的位置 void Floyd(MGraph &M,int path[MaxVertexNum][MaxVertexNum]){ int A[M.vertexnum][M.vertexnum];//记录数组中任意两个顶点之间的最短距离 for(int i=0;i<M.vertexnum;i++){ for(int j=0;j<M.vertexnum;j++){ A[i][j]=M.Edge[i][j]; path[i][j]=-1; } } for(int k=0;k<M.vertexnum;k++){ for(int j=0;j<M.vertexnum;j++){ for(int i=0;i<M.vertexnum;i++){ if(A[i][j]>A[i][k]+A[k][j]){ A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } } } printf("A矩阵\n"); for(int i=0;i<M.vertexnum;i++){ printf(" "); for(int j=0;j<M.vertexnum;j++){ printf("%d ",A[i][j]); } printf("\n"); } printf("path矩阵\n"); for(int i=0;i<M.vertexnum;i++){ printf(" "); for(int j=0;j<M.vertexnum;j++){ printf("%d ",path[i][j]); } printf("\n"); } } int main(){ MGraph M; CreatGraph(M); PrintGraph(M); int path[MaxVertexNum][MaxVertexNum];//记录当前两节点间要经过的中间节点 Floyd(M,path); }
标签:缓存 size printf 位置 邻接矩阵 存储结构 har 清除 数据
原文地址:https://www.cnblogs.com/Yshun/p/11421356.html