P1351 聯合權值

2022-08-18 22:27:19 字數 1210 閱讀 8677

題目啦啦啦

n個點,n-1n−1條邊,我們很容易就能想到這是一棵樹,看資料範圍,如果暴力列舉的話,只能拿部分分,這時候我們就回到題目中看,發現,只有距離為22才會產生價值的話,如果列舉乙個節點,只有 它和它的孫子之間 或者 它的兩個兒子之間 才會產生價值,所以我們就可以列舉這個節點,進行dfsdfs,期間進行更新就好了,具體的實現可以看**

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

67 inline int

read()

1415

const

int n = 1e6 + 11;16

const

int m = 2e5 + 7;17

const

int mod = 10007;18

19//

鄰接表存圖

20struct

node e[n];

2324

int head[m], cnt = 0;25

26 inline void add(int

from, int

to)

3132

intn, w[m], x, y, tot[m], ma[m], cma[m], ans, maxn;

33//

tot[x]陣列記錄x所有兒子的價值,ma[x]記錄x所有兒子中的最大值,cma[x]記錄x所有兒子中的次大值

3435

//dfs!!

36void dfs(int u, int

fa)

48//

兒子之間產生的價值

49for(int i = head[u]; i; i =e[i].nxt) 56}

5758

intmain()

65for(int i = 1; i <= n; i++) w[i] = read();//

cout << w[i] << '\n';

66 dfs(1, 0

);67

while(ans < 0) ans += mod; //

答案可能是負的,只要是負的就一直加模數

68 cout << maxn << "

"<< ans << '\n'

;69return0;

70 }

P1351 聯合權值

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

P1351 聯合權值

然而這只是一道普及 提高的大水題 洛谷鏈結 這道題是2014年提高組day1的第二題。簡單題意就是在樹上每個點都有權值,相鄰兩點的距離為1,求距離為2的點的權值乘積的和以及最大值。基本思路就是遍歷整棵樹,然後找到距離該點距離為2的點,計算距離,更新最大值和乘積和。但這樣就很慢了。所以我們可以遍歷中間...

P1351 聯合權值

為了寫一寫lca,我就按照標籤找 結果這道題我寫完竟然沒用lca 真是神奇。很多人 包括我 首先就想到了要列舉每乙個點,再列舉任意這個點的兩個兒子,可是顯然o n2 會t 其實我們只要線性掃一遍就可以了,利用小學學到的乘法分配率,邊走邊加val,這樣下乙個點和val的乘積就是它和這之前所有的點的乘積...