最優路線 Floyed

2021-10-23 17:38:38 字數 1849 閱讀 4738

>description

乙個 n 個點 m 條邊的無重邊無自環的無向圖,點有點權,邊有邊權,定義一條路徑的權值為路徑經過的點權的最大值乘邊權最大值。求任意兩點間的權值最小的路徑的權值。

>input

第一行兩個整數 n,m,分別表示無向圖的點數和邊數。

第二行 n 個正整數,第 i 個正整數表示點 i 的點權。

接下來 m 行每行三個正整數 ui,vi,wi​,分別描述一條邊的兩個端點和邊權。

>output

n 行每行 n 個整數,第 i 行第 j 個整數表示從 i 到 j 的路徑的最小權值,如果從 i 不能到達 j,則該值為 −1。特別地,當 i=j 時輸出 0。

>sample input

3 32 3 3

1 2 2

2 3 3

1 3 1

>sample output

0 6 3

6 0 6

3 6 0

對於 20% 的資料,n≤5,m≤8。

對於 50% 的資料,n≤50。

對於 100% 的資料,n≤500,m≤n(n−1)/2,邊權和點權不超過 10^9。

>解題思路

看到這個輸出和資料範圍,我們很容易想到floyed,但重要的是floyed怎麼打 比賽時打的floyed爆0了

floyed一般處理的是邊權,但是這道題處理的又有點權又有邊權又求的是最大值就很難處理

邊權我們可以常規處理,這樣我們只要考慮點權

我們對點權進行從小到大排序,floyed的中轉點從小到大列舉,這樣對於(i,j)中的最大點權,就轉化成了max

(ai,

at,a

j)

max(ai,at,aj)

max(ai

,at,

aj)這三個點了(如果你質疑ai~at之間有更大的點,那這是8可能的,因為這樣我們需要在之前用那個點作為中轉點求出(i,t),但是我們的中轉點從小到大列舉,這樣的情況不可能)。

最後加上瘋狂卡常

>**

#include 

#include

#include

#include

#define n

505#define ll long long

#define rg register

using namespace std;

struct point

s[n];

int n, m;

ll a[n]

, w[n]

[n], f[n]

[n];

bool cmp

(point aa, point bb)

ll read()

return l;

}void

write

(ll l)

signed main()

sort

(s +

1, s +

1+ n, cmp)

;//排個序

ll u, v, l;

for(rg int i =

1; i <= m; i++

)for

(rg int tt =

1; tt <= n; tt++)}

for(rg int i =

1; i <= n; i++

)putchar(10

);}return0;

}

Floyed演算法學習

正如我們所知道的,floyd演算法用於求最短路徑。floyd演算法可以說是warshall演算法的擴充套件,三個for迴圈就可以解決問題,所以它的時間複雜度為o n 3 floyd演算法的基本思想如下 從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。...

閉包傳遞(floyed)

題目大意 n代表母牛的個數,m代表給定的資訊的組數。每一組數包括a,b.代表b崇拜a 突然發現可以用tarjan演算法做 然後問你最終有多少母牛的地位是確定的。include include include include include include include include includ...

最小環問題 Floyed

解題報告 要通過此題就要明白 flo yedfloyed floyed 演算法原理及其每步的含義。for int k 1 k n k 其本質就是動態規劃 k作為階段必須置於最外層,i,j作為附加狀態置於內層 mp可以理解為 經過若干個編號不超過k的節點從i到j的最短路,進而轉化為兩個子問題 1.經過...