C++实现Floyd算法,求解所有点间的最短距离

C++实现Floyd算法

1,原理

Floyd算法用来求解所有顶点间的最短距离,可以应用于有向图和无向图。基本思想是,先用矩阵存储各个点间的直达路径,然后将各个顶点依次加入,每加入一个顶点,就以该点为中间点,计算各个点间的路径在通过该中间点的情况下是否比原来的短,若短,则更新路径长度。将所有顶点都加入后,所得矩阵的每个数据就是对应两点间的最短路径。

2,举例

在这里插入图片描述
如图,以无向图为例
1,用初始矩阵dist存储各个点的直达路径距离,dist[i][j]表示从vi到vj的距离,各个点到自身距离为0,若两点无法直达,则距离为Max。(这里因为是无向图,所以 dist[i][j] = dist[j][i] )
在这里插入图片描述
2,将v0点加入,由于dist[2][0] + dist[0][3] = 5 < dist[2][3] = 6, 所以 dist[2][3] = dist[3][2] = 5; 同理,dist[2][0] + dist[0][1] = 3 < dist[2][1] = Max, 所以 dist[2][1] = dist[1][2] = 3;

在这里插入图片描述
3,继续加入顶点更新矩阵,待全部加入后,所得矩阵中 dist[i][j] 的值即为从vi到vj得最短距离。

在这里插入图片描述

3,代码实现

#include<iostream>
using namespace std;
#define Max 9999

int n, m;
int dist[Max][Max];

void Floyd()
{
    
    
	for (int i = 0; i < n; ++i)
	{
    
    
		for (int j = 0; j < n; ++j)
		{
    
    
			for (int p = 0; p < n; ++p)
			{
    
    
				if (dist[j][p] > dist[j][i] + dist[i][p])
				{
    
    
					dist[j][p] = dist[j][i] + dist[i][p];
				}
			}
		}
	}
	
}

int main()
{
    
    
	cout << "输入节点数: ";
	cin >> n;
	cout << "输入边数:";
	cin >> m;
	for (int i = 0; i < n; ++i)//初始化各个数组
	{
    
    
		for (int j = 0; j < n; ++j)
		{
    
    
			if (j == i)
			{
    
    
				dist[i][j] = 0;
			}

			else
			{
    
    
				dist[i][j] = Max;
			}
		}
	}
	int u, v, w;
	cout << "输入各条边的信息:" << endl;
	for (int i = 0; i < m; ++i)
	{
    
    
		cin >> u >> v >> w;
		dist[u][v] = dist[v][u] = w;
	}

	Floyd();

	for (int i = 0; i < n; ++i)
	{
    
    
		for (int j = 0; j < n; ++j)
		{
    
    
			cout  << dist[i][j] << " \t";
		}
		cout << endl;
	}

	return 0;
}

输入输出信息
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46027243/article/details/108913252
今日推荐