Floyd algorithm!!!!!(万恶的弗洛伊德算法)

        曾经有位滑稽的博主说过:搜索就是优雅的暴力。今天他又要说,DP就是优雅地搜索。

        不是每一个弗洛伊德都写算法,也不是写算法的都叫弗洛伊德,还有一位人家写性学三论去了。

        这位弗洛伊德来历不一般,斯坦福大学的教授,1978年的图灵奖就发给人家了,这么一个很牛的弗洛伊德。

        基本思想就是DP,开个二维数组来找最短路辣~

        缺点就是因为要开二维数组所以就是容易报内存错误,比如数组开的太大辣,或者运行出错啊之类的。

        优点就是,思路简单。

        言归正传,弗洛伊德算法的基本思路,如果说我们从A到B点时,经历一个C点可以使路径或者时间更短的话就从这里中转,然后尝试再加一个中转点,再加一个,再加一个,不停地加下去,直到所有可能都已经列举。

        优雅的搜索。

        所以这个东西我感觉没有什么讲头给泥萌直接上代码辣OVO:

#include
#include
#define inf 0x3f3f3f3f//假定无穷大
#define maxn 1000//问题规模

int dis[maxn][maxn];//问题数组,dis[i][j]代表点i到j的距离

int main()
{
	int n;
	scanf("%d", &n);
	memset(dis, inf, sizeof(dis));//在不知道点的距离的时候就默认所有点之间都是无穷大
	int a, b,c;
	while (n--)//首先输入几个已知点之间的距离
	{
		scanf("%d %d %d", a, b, c);
		dis[a][b] = dis[b][a] = c;//这里默认用无向图
	}
	for (int k = 0	; k < maxn; k++)//Floyd算法
	{
		for (int i = 0; i < maxn; i++)
		{
			for (int j = 0; j < maxn; j++)
			{
				dis[i][j] = dis[i][j] <= dis[i][k] + dis[k][j] ? dis[i][j] : dis[i][k] + dis[k][j];//DP!!!!!!!!!!!
			}
		}
	}
	int t;
	scanf("%d", &t);//T次询问辣~
	while (t--)
	{
		scanf("%d %d", &a, &b);
		printf("%d\n", dis[a][b]);
	}
	return 0;
}

 

喜欢别忘记点赞!QAQ

你可能感兴趣的:(ACM,算法)