>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.經過...