Floyd算法求解各个顶点的最短距离

  1. 问题
     用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)

在这里插入图片描述

  1. 解析

任意节点i到j的最短路径两种可能:

直接从i到j;(不可能)
从i经过若干个节点k到j。

map(i,j)表示节点i到j最短路径的距离,对于每一个节点k,检查map(i,k)+map(k,j)小于map(i,j),如果成立,map(i,j) = map(i,k)+map(k,j);遍历每个k,每次更新的是除第k行和第k列的数。
3. 设计
距离矩阵:

void floyd()
{
int i, j, k;
for(k from 1 to n)
{
for(i from 1 to n)
{
for(j from 1 to n)
{
if(从i到j经过k的距离比目前从i到j的距离短)
e[i][j] = e[i][k] + e[k][j];//更新从i到j的距离
}
}
}
}

  1. 分析
    三重for循环,时间复杂度:O(n3);空间复杂度:O(n2);
  2. 源码
#include<iostream>
#include<fstream>
using namespace std;
int e[999][999];
int m, n, u, v, l;//n个顶点,m条边,输入m行,一行有顶点u,v,距离l
const int inf=0x3f3f3f3f;
ifstream fin("input.txt");
ofstream fout("output.txt");
void init() 
{
	for(int i=1; i<=n; ++i) 
	{
		for(int j=1; j<=n; ++j) 
		{
			if(i == j)
				e[i][j] = 0;
			if(i != j) 
				e[i][j] = inf;

		}
	}
}
void floyd() 
{
	int i,j,k;
	for(k=1; k<=n; ++k) 
	{
		for(i=1; i<=n; ++i) 
		{
			for(j=1; j<=n; ++j) 
			{
				if(e[i][k] < inf && e[k][j] < inf && e[i][j] > e[i][k] + e[k][j])
					e[i][j] = e[i][k] + e[k][j];
			}
		}
	}
}
int main()
{
	fin >> n >> m;
	init();
	for(int i=1; i<=m; ++i) 
	{
		fin >> u >> v >> l;
		e[u][v] = l;
	}
	floyd();
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			fout << e[i][j] << " ";
		}
		fout << endl;
	}
	fin.close();
	fout.close();
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值