Floyed算法求最短路径

                                       Floyed算法求最短路径

                                                                                   ——HM

 

Floyed是一个最短路径问题的一种较为简单的算法,既然简单,缺点就很多,如存储方式只能用二维邻接矩阵来完成,时间复杂度太高(O(n^3))等等问题,竞赛中用的并不是很多,但其思维有用,并且当数据较水是可以适当的骗骗分,大多数情况下是挺有用的。

首先要先了解邻接矩阵这一存图方式:其实这种方式竞赛中并不常用,因为它的占空间极大,是n^2级别,但也有优点,如深搜较快,存图全面等。大体思路就是动态规划的思想,尽管时间复杂度和空间复杂度都与跑n遍Dijkstra差不多,但其简短易写,有时能起到较好的骗分效果。

建图时将两个节点直接相连的两个点赋其权值,不直接相通的两个点赋“无限大”,操作时,将两个点之间建设跳板(第三个点),看它们之间是否存在更短路径并进行替换。

 

 

如两点A、B权值为3,A、C权值为10,B、C权值为4,则W[A,B]+W[B,C]<W[A,C],所以将A、C两点之间权值赋成3+4=7代替掉较大的10。

附代码:

#include <iostream>
#define now ga[i][k]+ga[k][j]
using namespace std;

const int SIZE=1005;
int ga[SIZE][SIZE];

int main()
{
	int n,e,w,sta,end;
	cin>>n>>e;
	for (int i=1;i<=e;i++){
		int x,y;
		cin>>x>>y>>w;
		ga[x][y]=ga[y][x]=w;
	}
	cin>>sta>>end;
	
	for (int k=1;k<=n;k++)
		for (int i=1;i<=n;i++)
			for (int j=1;j<=n;j++){
				if (i==j || i==k || k==j) continue;
				if (now<ga[i][j])//now为跳板,上面宏定义过 
					ga[i][j]=now;
			}
	
	cout<<ga[sta][end]<<endl<<endl;
	/*for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++)
			cout<<ga[i][j]<<' ';
		cout<<endl;
	}	打印操作后的图	*/
	
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值