2021/05/30 多源最短路径算法(floyd算法)三个for

本文介绍了Floyd算法,一种求解多源最短路径的实用方法,通过三维循环更新最短路径,并利用二维矩阵和路径记录数组。通过实例演示了如何初始化数据结构并执行算法,适用于图论问题中的路径优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求多源最短路径算法当然也可以多次调用单源最短路径。

这里有另一种算法---floyd算法,相对来说也比较容易理解;

暴力循环三次,里面放一句if语句——  if(D[i][k]+D[k][j]<D[i][j]) D[i][j]=D[i][k]+D[k][j];

首先需要一个二维矩阵D[][] 它的作用是存储最短路径;例如D[i][j]的值就是i到j的最短路径长度;

还可以有一个path[][],作用跟前面求单源最短路径也是一样的,存储来时走过的路

例如path[1][3]=2; 意思是顶点1到顶点3要经过顶点2;顶点1->2->3就是顶点1到顶点3的最短路径;

在做这个算法之前还是需要初始化path数组(弄成-1)以及二维数组D(除了邻居有边的其他全为正无穷);

void floyd()
{	
	int i,j,k;
	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
		path[i][j]=-1;
		if(a[i][j]>0) //如果有直接相连的边 
		D[i][j]=a[i][j];
		else
	    D[i][j]=MAX;//初始化为正无穷大 
    }
	for(k=0;k<N;k++)
	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
		if(D[i][k]+D[k][j]<D[i][j])
		{
			D[i][j]=D[i][k]+D[k][j];
			path[i][j]=k;//把它们之间的顶点记录下来
		}
	}
}

完整测试代码如下:

#include<stdio.h>
#include<stdlib.h>
#define MAX 10000000 //正无穷 
int N;//顶点数 
int E;//边数 
int a[10][10];//邻接矩阵 
int D[10][10];//D将存储各个点之间的最短路径,如D[i][j]的值就是i->j的最短路径 
int path[10][10];//更新路径 
void floyd();//多源最短路径算法 
int main()
{
	int i,j,x1,x2,w;	
	scanf("%d%d",&N,&E);	
	for(i=0;i<E;i++)
	{
		scanf("%d%d%d",&x1,&x2,&w);
		a[x1][x2]=a[x2][x1]=w;//给每条路赋予权重 这里假设权重即路径(大于0) 
	}
	floyd();
	for(i=0;i<N;i++)
	D[i][i]=0;//自己到自己路径长度为0
	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
		printf("顶点%d到顶点%d的最短路径是:%d\n",i,j,D[i][j]);		
	}				
	return 0;
}
void floyd()
{	
	int i,j,k;
	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
		path[i][j]=-1;
		if(a[i][j]>0) //如果有直接相连的边 
		D[i][j]=a[i][j];
		else
	    D[i][j]=MAX;//初始化为正无穷大 
    }
	for(k=0;k<N;k++)
	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
		if(D[i][k]+D[k][j]<D[i][j])
		{
			D[i][j]=D[i][k]+D[k][j];
			path[i][j]=k;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值