【問題描述】
無向連通圖 g 有 n 個點,n-1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為wi
, 每條邊的長度均為 1。圖上兩點(u, v)的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對(u, v),若它們的距離為 2,則它們之間會產生wu
×wv
的聯合權值。請問圖 g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少? 5
1 22 3
3 44 5
1 5 2 3 10
20 74
第一次去提高組碰到的題目……沒錯noip2014……當時我那叫乙個聰明啊,直接開了個鄰接矩陣。資料範圍那叫乙個小啊,n<=200000啊,然後華麗麗地全部mle……好吧,其實當時是因為不會鄰接表,而且當時我的思路有點問題……陣列範圍改小後也只過了3個點。
下面來說正解。
然後對於每乙個點,如果我們乙個個點對去找,是會tle3個點的,那麼最好的方法是這樣的:我們知道乙個點所直接連線的點兩兩之間都是有序點對,那麼,當我們搜到第n個點時,它所組成的所有點對的聯合權值為前面所有點的權值加起來與它相乘(這是關鍵部分!!!不懂的自己算一算,想一想),由於題目中(1,3)和(3,1)算兩個不同的有序點對,因此我們需要把答案乘2。注意:在算答案的時候要邊算邊取模。下面貼**。
1type rec=record
2c,next:longint;
3end;4
var g:array[0..200010] of
rec;
5 e:array[0..400010] of
rec;
6efree,n,u,v,i,j,k,max,ans,max1,max2,sum:longint;
7 w:array[0..200010] of
longint;
8procedure add(x:longint;var
p:rec);
9begin
10 e[efree].c:=x;
11 e[efree].next:=p.next;
12 p.next:=efree;
13inc(efree);
14end;15
begin
16readln(n);
17for i:=1
to n do
18 g[i].next:=-1
;19 efree:=1;20
for i:=1
to n-1
do21
begin
22readln(u,v);
23add(u,g[v]);
24add(v,g[u]);
25end;26
for i:=1
to n do
27read(w[i]);
28for i:=1
to n do
29begin
30 j:=g[i].next;
31 sum:=0
;32 max1:=0
;33 max2:=0;34
while j<>-1
do35
begin
36 k:=w[e[j].c];
37if k>max1 then
38 max1:=k
39else
40if k>max2 then
41 max2:=k;
42 ans:=ans+(sum mod
10007)*k*2
mod10007
;43 ans:=ans mod
10007;44
inc(sum,k);
45 j:=e[j].next;
46end;47
if max1*max2>max then
48 max:=max1*max2;
49end
;50 writeln(max,'
',ans);
51end.
聯合權值(codevs 3728)
無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu 的聯合權值。請問圖 g 上所有可產生...
3728 聯合權值
無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中...
3728 聯合權值
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 題目描述 description 輸入描述 input description 輸出描述 output description 樣例輸入 sample input 樣例輸出 sample output 資料範圍及提...