推免复习之数据结构与算法 佛洛依德算法

佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行“松弛操作”,直到全部遍历一遍。那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,graph[v][u]为顶点v到顶点u的路径长度,松弛操作就是寻找一个中间节点k,使graph[v][u]>graph[v][k]+graph[k][u],若得到此关系,说明通过这个中间节点可以减小v和u之间的距离,所以我们更新距离,graph[v][u]=graph[v][k]+graph[k][u],一直重复操作,直到所有中间节点k,所有v和u都被遍历到,此时循环结束,graph数组里的就是各节点间的最小距离,核心代码如下:

        for (int k = 0; k < size; k++)
	{
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				if (graph[i][j] > graph[i][k] + graph[k][j])
				{
					graph[i][j] = graph[i][k] + graph[k][j];
				}
			}
		}
	}

全部的代码如下,节点数可自行更改:

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;

void InputGraph(vector<vector<int>> &graph)  //输入权值,否则为无穷大
{
	int count = 0;
	cin >> count;
	int size=graph.size();
	for (int i = 0; i < size; i++)
	{
		graph[i][i] = 0;
	}
	for (int i = 0; i < count; i++)
	{
		int start = -1, end = -1, weight = 0;
		cin >> start >> end >> weight;
		graph[start][end] = weight;
	}
}

void Floyd(vector<vector<int>> &graph)  //使用佛洛依德算法求最短路径长度
{
	int size = graph.size();
	for (int k = 0; k < size; k++)
	{
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				if (graph[i][j] > graph[i][k] + graph[k][j])
				{
					graph[i][j] = graph[i][k] + graph[k][j];
				}
			}
		}
	}
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cout <<setw(6)<< graph[i][j] << "  ";
		}
		cout << endl;
	}
}

int main()
{
	vector<vector<int>> graph = vector<vector<int>>(5, vector<int>(5, 999999));
	InputGraph(graph);
	Floyd(graph);
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值