#include<stdio.h> #define INFINITY 100 //表示∞ #define MAX_VERTEX_NUM 20 //最大顶点个数 typedef enum {DG,DN,UDG,UDN} GraphKind;//图的种类 typedef struct//邻接矩阵 { int adj; //表示权值 char *info; //与弧相关信息的指针 }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct//图 { char vexs[MAX_VERTEX_NUM];//顶点数组 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum;//顶点数及弧数 GraphKind kind;//图的种类 }MGraph; int LocateVex(MGraph G,char vexs);//查找顶点在图中的位置,并返回其在数组中的下标 void CreateDN(MGraph &G);//建图 void Ppath(MGraph G,int P[][MAX_VERTEX_NUM],int i,int j);//输出任意两点间最短路径上的中间点 void ShortestPath_FLOYD(MGraph G);//求图中每两点间的最短路径 void main() { MGraph G; G.kind=DN; CreateDN(G); ShortestPath_FLOYD(G); } int LocateVex(MGraph G,char vexs) { for(int i=0;i<G.vexnum&&G.vexs[i]!=vexs;i++); if(G.vexs[i]==vexs) return i; else { return 0; printf("ERROR!"); } } void CreateDN(MGraph &G) { int i,j,k,w; char v1,v2; printf("请输入顶点数和弧数,中间用逗号隔开:"); scanf("%d,%d",&G.vexnum,&G.arcnum); getchar();//消去回车符 printf("请依次输入全部的顶点字符\n"); printf("例如:有顶点a,b,c,则输入:abc\n"); for(i=0;i<G.vexnum;++i) scanf("%c",&G.vexs[i]); for(i=0;i<G.vexnum;++i) for(j=0;j<G.vexnum;++j) { if(i==j) G.arcs[i][j].adj=0; else { G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } } printf("输入弧,例如:弧的权值是3,弧的尾指针是a,头指针是b\n"); printf("则输入:3,a,b\n"); for(k=0;k<G.arcnum;++k) { getchar();//消去回车符 printf("请输入弧的权值及其尾头两个顶点"); scanf("%d,%c,%c",&w,&v1,&v2); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j].adj=w;//输入权值 } } void Ppath(MGraph G,int P[][MAX_VERTEX_NUM],int i,int j) { int k; k=P[i][j]; if(k==-1) return; printf("-->%c",G.vexs[k]); Ppath(G,P,k,j); } void ShortestPath_FLOYD(MGraph G) { int i=1,j,k,u,v,w; int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; for(v=0;v<G.vexnum;++v) for(w=0;w<G.vexnum;++w) { D[v][w]=G.arcs[v][w].adj; P[v][w]=-1; } for(u=0;u<G.vexnum;++u)//逐步添加顶点 for(v=0;v<G.vexnum;++v) for(w=0;w<G.vexnum;++w) if(D[v][w]>D[v][u]+D[u][w])//判定是否有更短路径 { D[v][w]=D[v][u]+D[u][w]; P[v][w]=u; } for(j=0;j<G.vexnum;j++)//输出最短路径及其长度 for(k=0;k<G.vexnum;k++,i++) if(D[j][k]==INFINITY) printf("%d.从%c到%c没有路径。\n",i,G.vexs[j],G.vexs[k]); else { printf("%d.从%c到%c的最短路径为:%c",i,G.vexs[j],G.vexs[k],G.vexs[j]); Ppath(G,P,j,k); printf("-->%c,路径长度为:%d\n",G.vexs[k],D[j][k]); } }