#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]);
}
}
顶点间最短路径求解
最新推荐文章于 2023-07-24 16:37:40 发布