顶点间最短路径求解

#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]);
			} 
}

你可能感兴趣的:(Algorithm,数据结构)