時間限制: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輸出 #11 22 3
3 44 5
1 5 2 3 10
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的點對有兩種: 我們在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; } 鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc... 評測傳送 70分 列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。可能退化為n 2 100分 在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum i 表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 sum i... 題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...八字形
和1字形
。/*
NOIP2014 聯合權值
NOIP 2014 聯合權值
(noip2014)聯合權值