3728 聯合權值

2022-05-03 15:51:32 字數 1551 閱讀 4377

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

題解檢視執行結果

題目描述 description

輸入描述 input description

輸出描述 output description

樣例輸入 sample input

樣例輸出 sample output

資料範圍及提示 data size & hint

分類標籤 tags 點此展開 

noip全國聯賽提高組

2023年

本來以為很水的一道mst,結果tle了3個點

70分**:

#includeusing

namespace

std;

#define n 300100

#define mod 10007vector

g[n];

intn,maxn,ans,w[n],vis[n];

void dfs(int t)

}}int

main()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

printf(

"%d %d\n

",maxn,ans);

return0;

}

思路引導:

以上為日照夏令營提供的標解;(有能力者,自己寫**)--在此僅做整理。

以下為自己以前寫的**;

優化後ac**:

題解:

maxn 很顯然等於某個點的最大的兒子乘以次大的兒子(有點「貪心」的味道)

ans = w[x] * (sum[fa[x]] - w[x]),fa[x]指的是父親節點,但是這樣會重複計算,所以直接按照dfs序去跑(這裡直接迴圈就好了),計算過的就刪去就好了

//

正解:列舉每個點,這個點所連線的任意兩點的距離為2,把它們都放到乙個陣列裡,取最大的兩個數相乘即為當前最優解,對於所有點取大;

//至於權值和,補充乙個數學知識:(a+b+c)^2=a*a+b*b+c*c+2ab+2ac+2bc, 2ab+2ac+2bc即為當前和,對於所有點取和。

#includeusing

namespace

std;

#define n 300100

#define mod 10007vector

g[n];

intn,maxn,ans,w[n];

intmain()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

maxn=max(maxn,m1*m2);

ans=(ans+(s*s-p)%mod)%mod;

}printf(

"%d %d\n

",maxn,ans);

return0;

}

3728 聯合權值

無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中...

聯合權值(codevs 3728)

無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu 的聯合權值。請問圖 g 上所有可產生...

聯合權值(codevs 3728)題解

問題描述 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為wi 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wu wv 的聯合權值。請問圖 g 上所...