洛谷 NOIP2014 聯合權值 DFS

2021-09-27 02:23:29 字數 2685 閱讀 2964

時間限制:1.00s記憶體限制:125.00mb

無向連通圖g有n個點,n−1條邊。點從1到n依次編號,編號為i的點的權值為w

iw_i

wi​,每條邊的長度均為 1。圖上兩點(u,v) 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對(u,v),若它們的距離為 2,則它們之間會產生wv×

wu

w_v \times w_u

wv​×wu

​的聯合權值。

請問圖g上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?

第一行包含1個整數n。

接下來n-1行,每行包含2個用空格隔開的正整數u, v表示編號為u和編號為v的點之間有邊相連。

最後1行,包含n個正整數,每兩個正整數之間用乙個空格隔開,其中第i個整數表示圖g上編號為i的點的權值為w

iw_i

wi​。

輸出共 11 行,包含 22 個整數,之間用乙個空格隔開,依次為圖 gg 上聯合權值的最大值和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對1000710007取餘。

輸入 #1

5

1 22 3

3 44 5

1 5 2 3 10

輸出 #1
20 74

本例輸入的圖如上所示,距離為2 的有序點對有(1,3)(1,3)、(2,4)(2,4)、(3,1)(3,1)、(3,5)(3,5)、(4,2)(4,2)、(5,3)(5,3)。

其聯合權值分別為2 、15、2 、20、15、20。其中最大的是20,總和為74。

對於30%的資料,1

1001 < n \leq 100

1100;

對於60%的資料,1

2000

1 < n \leq 2000

12000

;對於100%的資料,1

200000,0

≤10000

1 < n \leq 200000, 0 < w_i \leq 10000

12000

00,0

​≤10

000保證一定存在可產生聯合權值的有序點對。

題意:對於圖中距離為2的兩點,它們的聯合權值為wu×

wv

w_u \times w_v

wu​×wv

​,求出所有的這種聯合權值最大的是多少?所有的聯合權值之和是多少?

思路:距離為2的點對有兩種:八字形1字形

我們在dfs過程中對每個點維護兩個值:max_[u]表示節點u的所有子節點權值的最大值,sum_[u]表示節點u的所有子節點權值之和。

對於八字形:直接將當前節點的所有子節點兩兩配對的結果統計出來即可。這一步線性掃瞄一遍即可,不需要o(n

2)

o(n^2)

o(n2

)列舉。

我們以求總和為例,求最大值類似。從前往後枚舉子節點時維護變數sum_[u],那麼此時sum_[u]表示u的前面所有子節點的權值和,則每次將sum_[u]與當前節點的權值的乘積累加起來,就是當前節點的所有子節點兩兩配對的總權值和。

對於1字形,那麼以u為最高點的1字形點對權值之和就是u的權值乘以u的所有子節點的sum_[s]之和。求最大值類似。

由於題目中要求的是有序點對的和,因此權值和需要乘2。

accepted code:

/*

* @author: lzyws739307453

* @language: c++

*/#include

using

namespace std;

const

int mod =

10007

;const

int maxn =

200005

;struct edge

edge

(int to,

int ne):to

(to),ne

(ne)

}e[maxn <<1]

;int he[maxn]

, cnt;

int ans_max, ans_sum;

int max_[maxn]

, sum_[maxn]

, w[maxn]

;void

init()

void

add(

int u,

int v)

void

dfs(

int u,

int fa)}}

intmain()

for(

int i=

1; i <= n; i++

)scanf

("%d"

,&w[i]);

dfs(1,

-1);

printf

("%d %d\n"

, ans_max,

(ans_sum <<1)

% mod)

;return0;

}

NOIP2014 聯合權值

鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...

NOIP 2014 聯合權值

評測傳送 70分 列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。可能退化為n 2 100分 在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum i 表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 sum i...

(noip2014)聯合權值

題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...