弗洛伊德算法
曾经有位滑稽的博主说过:搜索就是优雅的暴力。今天他又要说,DP就是优雅地搜索。
不是每一个弗洛伊德都写算法,也不是写算法的都叫弗洛伊德,还有一位人家写性学三论去了。
这位弗洛伊德来历不一般,斯坦福大学的教授,1978年的图灵奖就发给人家了,这么一个很牛的弗洛伊德。
基本思想就是DP,开个二维数组来找最短路辣~
缺点就是因为要开二维数组所以就是容易报内存错误,比如数组开的太大辣,或者运行出错啊之类的。
优点就是,思路简单。
言归正传,弗洛伊德算法的基本思路,如果说我们从A到B点时,经历一个C点可以使路径或者时间更短的话就从这里中转,然后尝试再加一个中转点,再加一个,再加一个,不停地加下去,直到所有可能都已经列举。
优雅的搜索。
所以这个东西我感觉没有什么讲头给泥萌直接上代码辣OVO:
#include<stdio.h>
#include<string.h>
#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
相关阅读
文章出处:https://www.cnblogs.com/ECJTUACM-873284962/p/6995648.html 暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城
转自:https://blog.csdn.net/ljhandlwt/article/details/52096932图论里一个很重要的问题是最短路径问题.这个问题,在离散数学课上