弗洛伊德算法

初学者。如果有误请指正,欢迎联系QQ2684162190

#include<stdio.h>
#include<stdlib.h>
#define INFINITY 65535
#define MAX_VERTEX_NUM 6
#define TRUE 1
int final[6];
typedef enum{DG,DN,UDG,UDN}GraphKind;	//有向图,有向网,无向图,无向网 
typedef struct ArcCell
{    
	int  adj;			//顶点的关系类型 
    int *info=NULL;     		//弧的相关信息指针 
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct{
	char vexs[MAX_VERTEX_NUM];		//顶点向量
	AdjMatrix arcs;				//邻接矩阵 
	int vexnum,arcnum;			//图当前顶点数与弧数 
	GraphKind kind;				//图种类标志 
}MGraph;
int CreateDG(MGraph &G)
{
	return 0;
}
int CreateDN(MGraph &G)
{
	return 0;
}
int CreateUDG(MGraph &G)
{
	return 0;
}
int LocateVex(MGraph &G,char v)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		if(v==G.vexs[i])
			return i;
	}
	if(i==G.vexnum)
		return 65535; 
}
int CreateUDN(MGraph &G)
{
//	printf("输入顶点数(按enter结束):");
//	scanf("%d",&G.vexnum);	//存储顶点数与弧数 
//	getchar();
//	printf("输入弧数(按enter结束):");
//	scanf("%d",&G.arcnum);
//	getchar();
//	printf("输入顶点信息(char):");
//	int i,j;
//	for(i=0;i < G.vexnum;i++)		//构造顶点向量 
//		scanf("%c",&G.vexs[i]); 
//	getchar();
//	for(i=0;i<G.vexnum;i++)
//		for(j=0;j < G.vexnum;j++)
//			G.arcs[i][j].adj=INFIN;
//	char v1,v2;
//	int w;
//	printf("输入依附于一条边的顶点与权值v1,v2,w:");
//
//	for(int k=0;k<G.arcnum;k++)
//	{
//		scanf("%c%c%d",&v1,&v2,&w);
//		i=LocateVex(G,v1);				//寻找v1在G中的位置 
//		j=LocateVex(G,v2);
//		G.arcs[i][j].adj=w;
//		G.arcs[j][i].adj=G.arcs[i][j].adj;		//对称赋值 
//	}

	G.vexnum = 6;
	G.arcnum = 10;
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		G.vexs[i]=(char)'a'+i;
	}
	for(i=0;i<G.vexnum;i++)
		for(j=0;j < G.vexnum;j++)
			G.arcs[i][j].adj=INFINITY;
	G.arcs[0][1].adj=6;G.arcs[1][0].adj=6;
	G.arcs[2][0].adj=1;G.arcs[0][2].adj=1;
	G.arcs[0][3].adj=5;G.arcs[3][0].adj=5;
	G.arcs[1][2].adj=5;G.arcs[2][1].adj=5;
	G.arcs[3][2].adj=5;G.arcs[2][3].adj=5;
	G.arcs[4][1].adj=3;G.arcs[1][4].adj=3;
	G.arcs[4][2].adj=6;G.arcs[2][4].adj=6;
	G.arcs[5][4].adj=6;G.arcs[4][5].adj=6;
	G.arcs[3][5].adj=2;G.arcs[5][3].adj=2;
	G.arcs[2][5].adj=4;G.arcs[5][2].adj=4;
	return 1;
}

int CreateGraph(MGraph &G)
{
//	printf("输入图的类型(0,1,2,3):");
//	scanf("%d",&G.kind);		//修改图的类型
	G.kind=UDN;
	switch(G.kind)
	{
		case DG:return CreateDG(G);
		case DN:return CreateDN(G);
		case UDN:return CreateUDN(G);
		case UDG:return CreateUDG(G);
		default :return 0;
	}
}

void shortPath_FLOYD(int (*P)[MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph &G,int D[][MAX_VERTEX_NUM])
{
	//用floyd算法求有向网G中各队顶点v到w之间的最短路径P[v][w]及其
	//带权长度D[v][w]。若p[v][w][u]为TRUE,则u是从V到W当前求得最短路径上的点 
	int v,w,u,i;  //对各个节点之间,初始化一致路径及距离 
	for(v = 0;v < G.vexnum;v++)
	for(v = 0;v < G.vexnum; ++v)
	{
		for(w = 0;w < G.vexnum;++w)
		{
			D[v][w] = G.arcs[v][w].adj;
			for( u = 0;u < G.vexnum;u++)
				P[v][w][u] = 0;
			if(D[v][w] < INFINITY)
			{
				P[v][w][v] = TRUE;	//从V到W的有直接路径 v是从V到W当前求得最短路径上的点 
				P[v][w][w] = TRUE;
			}
		}
	}
	for(u = 0;u < G.vexnum;u++)
		for(v = 0;v < G.vexnum;v++)
			for(w = 0;w < G.vexnum;w++) 
				if(D[v][u]+D[u][w] < D[v][w])
				{
					D[v][w] = D[v][u]+D[u][w];
					for(i = 0;i < G.vexnum;i++)
						P[v][w][i] = P[u][w][i];
				}
}
void result(int D[][6],int (*p)[6][6],int m,int n,MGraph &G)
{
	int i,temp = 0,d=m;
	printf("从%d到%d的最短路径上的点为:",m,n);
	for(i = 0;i<G.vexnum;i++)
		D[i][i]	= 0;
	for(i = 0;i<6;i++)
	{
		if(p[m][n][i]==1)
		{
			printf("%c ",G.vexs[i]);
			temp+=D[d][i];
			d = i;
		}
	}
	printf("\n最短路径为%d",temp);	
}
int main()
{
	MGraph *G=(MGraph*)malloc(sizeof(MGraph));
	CreateGraph(*G);
	int (*p)[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
	int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
	shortPath_FLOYD(p,*G,D);
	printf("输入求那两个顶点(只有6个顶点)的最短距离");
	int m,n;
	scanf("%d%d",&m,&n); 
	if(m>=6||n>=6)
	{
		printf("error");
		return 0;
	}
	result(D,p,m,n,*G);// 输出结果		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值