多源点最短路径(Floyd算法)

求有向带权图中每两个顶点之间的距离和路径


代码实现:

#include<iostream>
#include<malloc.h>
#define MaxVertexNum 100
#define INFINITY 10000 
using namespace std;
typedef struct{
	int vertex[MaxVertexNum];
	int Edge[MaxVertexNum][MaxVertexNum];
	int vertexNum,EdgeNum;
}MGraph;

//邻接矩阵法创建一个有向带权图 
void CreateMGraph(MGraph *G)
{
	int i,j,k,w;
	printf("请输入图的顶点数和边数:");
	cin>>G->vertexNum>>G->EdgeNum;
	printf("请输入图的各个顶点的信息(A,B…):");
	for(i=0;i<G->vertexNum;i++)
		cin>>G->vertex[i];
	for(i=0;i<G->vertexNum;i++)
	{
		for(j=0;j<G->vertexNum;j++)
			G->Edge[i][j]=INFINITY;		
	} 
	printf("请输入各条边的信息(例:1 2表示在A顶点和B顶点之间有一条边):\n");
	for(k=0;k<G->EdgeNum;k++)
	{//此为创建有向图的邻接矩阵 
		int Iindex,Jindex,weight; 
		cin>>Iindex>>Jindex>>weight;
		G->Edge[Iindex][Jindex]=weight;
	}		
} 

void DisplayMGraph(MGraph G)
{
	int i,j;
	printf("	");
	for(i=0;i<G.vertexNum;i++)
	printf("%d\t",G.vertex[i]);
	for(i=0;i<G.vertexNum;i++)
	{
		printf("\n%d\t",G.vertex[i]);
		for(j=0;j<G.vertexNum;j++)
			printf("%d\t",G.Edge[i][j]); 
	}	
}

void shortestPathFloyd(MGraph G)
{//u是开始顶点,此算法是u顶点是第一个允许中转的顶点 
	int i,j,k;
	int distance[G.vertexNum][G.vertexNum];
	int parentPath[G.vertexNum][G.vertexNum];
	for(i=0;i<G.vertexNum;i++)
	{
		for(j=0;j<G.vertexNum;j++)
		{//distance数组初始化 
			if(i==j)
				distance[i][j]=0;
			else
				distance[i][j]=G.Edge[i][j];
		}
	}
	for(i=0;i<G.vertexNum;i++)
		for(j=0;j<G.vertexNum;j++)
			parentPath[i][j]=-1;//初始化parentPath数组,每个元素的前驱结点都是-1
	for(k=0;k<G.vertexNum;k++)
	{//从顶点0开始考虑中转,k值表示k点被纳入中转 
		for(i=0;i<G.vertexNum;i++) 
		{//遍历数组 
			for(j=0;j<G.vertexNum;j++)
			{
				if(distance[i][k]+distance[k][j]<distance[i][j])
				//如果从i点到j点的距离大于从i点到k点加上从k点到j点的距离
				{
					distance[i][j]=distance[i][k]+distance[k][j];
					parentPath[i][j]=k; 
				} 
			} 
		}
	}
	printf("图中每两点之间的最短路径矩阵如下:");
	printf("\n  "); 
	for(i=0;i<G.vertexNum;i++)
		printf("%d\t",G.vertex[i]);
	for(i=0;i<G.vertexNum;i++)
	{
		printf("\n%d ",i);
		for(j=0;j<G.vertexNum;j++)
			printf("%d\t",distance[i][j]);	
	} 
	printf("\n\n前驱结点数组为:\n");
	for(i=0;i<G.vertexNum;i++)
		printf("%d\t",G.vertex[i]);
	for(i=0;i<G.vertexNum;i++)
	{
		printf("\n%d ",i);
		for(j=0;j<G.vertexNum;j++)
			printf("%d\t",parentPath[i][j]);	
	} 
}

int main()
{
	MGraph G;
	CreateMGraph(&G);
	shortestPathFloyd(G);
	return 0;	
} 

测试数据:

在这里插入图片描述

5 7
0 1 2 3 4
0 2 1
0 4 10
1 3 1
1 4 5
2 1 1
2 4 7
3 4 1

测试结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

commonbelive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值