您的位置:首页 > 其它

顶点间最短路径求解

2014-08-01 11:06 211 查看
#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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: