问题描述:利用邻接矩阵构造图,并求出某一顶点到其余顶点的最短路径并打印输出。
#include<stdio.h> #include<string.h> #define MAX_VERTEX_NUM 50 #define FALSE 0 #define TRUE 1 #define INFINITY 100000 typedef struct { char vexs[MAX_VERTEX_NUM][100]; int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum, arcnum; //分别为结点数和路径数 }MGraph; //寻找结点模块: int Location(MGraph G,char ch[]) { int i; for(i=0;i<G.vexnum;i++) { if(!strcmp(G.vexs[i],ch)) { break; } } return i; } //构建图模块: int Create(MGraph &G,int n) { int i,j,k,w; char v1[100],v2[100]; printf("请分别输入顶点和路径的的个数:\n"); scanf("%d%d",&G.vexnum,&G.arcnum); for(i=0;i<G.vexnum;++i) { for(j=0;j<G.vexnum;++j) { G.arcs[i][j]=INFINITY; } } printf("请输入%d个顶点:\n",G.vexnum); for(k=0;k<G.vexnum;k++) { scanf("%s",G.vexs[k]); } for(k=0;k<G.arcnum;++k) { printf("请输入第%d条弧上的两个顶点以及弧的权值:\n",k+1); scanf("%s%s%d",v1,v2,&w); i=Location(G,v1);//寻找出路径上前后两个结点在邻接矩阵中的存储位置 j=Location(G,v2); G.arcs[i][j]=w; if(n==2) { G.arcs[j][i]=w; } } return 0; } //寻找最短路径模块: void ShortestPath(MGraph G,int v0,int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int D[]) { int v,w,i,k,min,final[MAX_VERTEX_NUM]; for(v=0;v<G.vexnum;++v) { final[v]=FALSE; D[v]=G.arcs[v0][v]; for(w=0;w<G.vexnum;++w) { P[v][w]=FALSE; } if(D[v]<INFINITY) { P[v][v0]=TRUE; P[v][v]=TRUE; } } D[v0]=0; final[v0]=TRUE; P[v0][v0]=TRUE; for(i=1;i<G.vexnum;++i) { min=INFINITY; for(w=0;w<G.vexnum;++w) { if(!final[w]) { if(D[w]<min) { v=w; min=D[w]; } } } final[v]=TRUE; for(w=0;w<G.vexnum;++w) { if(!final[w]&&(min+G.arcs[v][w]<D[w])) { D[w]=min+G.arcs[v][w]; for(k=0;k<G.vexnum;k++) { P[w][k]=P[v][k]; } P[w][w]=TRUE; } } } } //主程序模块: int main() { MGraph G; char v0[100]; int i,j,m=1,k,n,P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM]; printf("**************************->欢迎使用<-****************************\n\n"); while(m!=0){ printf("有向图输入1;无向图输入2;"); scanf("%d",&n); Create(G,n); printf("起始点为:\n"); scanf("%s",v0); k=Location(G,v0); ShortestPath(G,k,P,D); for(i=0;i<G.vexnum;++i) { printf("%s->%s",G.vexs[k],G.vexs[i]); if(D[i]==INFINITY) { printf("无路径\n"); } else { printf("路径为:"); printf("<"); for(j=0;j<G.vexnum;j++) { if(P[i][j]==TRUE) { printf("%s->",G.vexs[j]); } } printf("\b\b"); printf(">"); printf("路径长度为%d",D[i]); printf("\n"); } } printf("输入0退出系统,输入1继续运行:"); scanf("%d",&m); } printf("*************************谢谢使用!***************************\n"); return 0; }