1. 程式人生 > >Floyd algorithm!!!!!(萬惡的弗洛伊德演算法)

Floyd algorithm!!!!!(萬惡的弗洛伊德演算法)

        曾經有位滑稽的博主說過:搜尋就是優雅的暴力。今天他又要說,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