noip2014 聯合權值 (樹形結構)

2021-07-05 15:24:47 字數 1839 閱讀 7558

p1906聯合權值

accepted

標籤:圖結構

noip提高組2014

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

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

×wv

的聯合權值。

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

第一行包含 1 個整數 n。

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

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

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

5

1 22 3

3 44 5

1 5 2 3 10

20 74
對於 30%的資料,1 < n ≤ 100;

對於 60%的資料,1 < n ≤ 2000;

對於 100%的資料,1 < n ≤ 200,000,0 <wi

≤ 10,000。

本例輸入的圖如上所示,距離為 2 的有序點對有(1,3)、(2,4)、(3,1)、(3,5)、(4,2)、(5,3)。 其聯合權值分別為 2、15、2、20、15、20。其中最大的是 20,總和為 74。

noip2014 提高組 day1

解析:這道題我是當做一棵n個節點的樹來處理的。題目上並沒有說沒有重邊、這是一棵樹等等,但是我也沒在現場考,沒法確認,並且資料就是一棵樹,多寫一些東西也沒什麼用。當然,說這些,只是表明讀題要仔細。

樹上的距離為2的點,我們只要列舉點 i ,那麼 i 的兒子之間的距離就是2。

記錄每個節點 i 的兒子中最大值與次大值,期中乘積最大的就是最大權值。

總權值就是每個節點的兒子們相互乘積之和。

**:

#include#include#include#includeusing namespace std;

const int maxn=2e5;

const int mod=10007;

int n,maxw=0,sumw=0;

int u[maxn+10],v[maxn+10],w[maxn+10];

int first[maxn+10],second[maxn+10],sum[maxn+10];

int getin()

int main()

else

if(w[v[i]]>second[u[i]])

second[u[i]]=w[v[i]];

sumw+=w[v[i]]*sum[u[i]],sumw%=mod;

sum[u[i]]+=w[v[i]],sum[u[i]]%=mod;

}for(i=1;i<=n;i++)maxw=max(maxw,first[i]*second[i]);

printf("%d %d",maxw,(2*sumw)%mod);

return 0;

}

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...