樹形DP 聯合權值

2021-08-14 14:33:09 字數 1955 閱讀 6177

題目描述

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

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

輸入格式:

輸入檔名為link .in。

第一行包含1 個整數n 。

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

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

輸出格式:

輸出檔名為link .out 。

輸出共1 行,包含2 個整數,之間用乙個空格隔開,依次為圖g 上聯合權值的最大值

和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007 取餘。

資料規模

n<=2*10^6

分析

首先我們發現,聯通,n-1條邊,這不是棵無向樹嘛

第一次做樹形dp好興奮

然後看了看題解

發現是一道樹形的東東,至於是不是dp。。應該不是吧,雖然標題打的樹形dp (總之以後要學就對了)

然後這題我們發現距離為2的點有兩種情況:

1、爺爺和孫子的情況,這種比較好處理,只要dfs多加個gf記錄爺爺,然後乘一乘,加一加,判一判就好(說的簡單)

注意事項:爺爺和孫子是雙向關係,就是爺爺也可以當孫子的孫子的,所以聯合權值務必乘2,不要問我怎麼知道的

2、兄弟,這個就比較難處理了,因為顯然不能暴力列舉兄弟否則超時

然後我們發現兄弟的聯合權值最大的情況也就是兄弟中最大的和次大的相乘,這樣就只用記錄最大值和次大值即可

總和其實也不難,我們發現是這樣的:w[i]*w[i]+w[i]*w[j]+w[i]*w[k]

+w[j]*w[j]+w[j]*w[i]+w[j]*w[k]

+w[k]*w[k]+w[k]*w[i]+w[k]*w[j]

乘法結合律:

w[i]×(w[i]+w[j]+w[k])+w[j]×(w[i]+w[j]+w[k])+w[k]×(w[i]+w[j]+w[k])

再簡化:

(w[i]+w[j]+w[k])*(w[i]+w[j]+w[k])

發現沒有,就是兄弟的總和的平方!然而不難發現,w[x]*w[x]的情況是非法的,所以還要多定乙個變數來儲存這種情況的總和,於是最後表達為:

(w[i]+w[j]+w[k])²-∑i,k w[x]²

就這樣啦!

#include 

#include

using namespace std;

int nex[4000001],lis[4000001],u[2000001],v[2000001],w[2000001];

int n,i,j,ma,ass;

void init()

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

scanf("%d",&w[i]);

}void dfs(int

s,int f,int gf)

while (i!=0)

else

if (q>mx2)

mx2=q;

su1=(su1+q)%10007;

su2=(su2+q

*q%10007)%10007;

}i=nex[i];

}ass=(ass+su1*su1

%10007-su2+10007)%10007;

ma=max(ma,mx1*mx2);

}int main()

洛谷P1351 聯合權值 樹形dp

題目鏈結 一道很簡單的樹形dp,然而被我寫的這麼長 分別記錄下距離為 1 2 的點數,權值和,最大值。以及相鄰兒子之間的貢獻。樹形dp一波。include define fin x define int long long using namespace std const int maxn 2e5...

洛谷P1351 聯合權值 樹形dp

給出n 2 e5 n leq2e5 n 2e 5個點,每個點都有乙個權值,每條邊的距離為1 11。求所有點對的權值最大值和權值和。只有兩種情況,1 父親的父親 2 同乙個結點的兩個兒子。第一種情形多帶乙個引數即可維護。第二種情形對於最大值只要維護兒子權值的最大和次大值,對於求和只要維護權值和和權值平...

noip2014 聯合權值 (樹形結構)

p1906聯合權值 accepted 標籤 圖結構 noip提高組2014 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為wi 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距...