無向連通圖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
取餘。輸入樣例
#1:
5
1 2
2 3
3 4
4 5
1 5 2 3 10
輸出樣例
#1:
20 74
本例輸入的圖如上所示,距離為
2的有序點對有
( 1,3)
、( 2,4)
、( 3,1)
、(3,5)
、( 4,2)
、( 5,3) 。
其聯合權值分別為2 、
15、2、
20、15、
20。其中最大的是
20,總和為74。
【資料說明】 對於
30%
的資料,
1 < n≤ 100;
對於60%
的資料,
1 < n≤ 2000;
對於100%
的資料,
1 < n≤ 200 , 000
,0 < wi≤ 10, 000。
一開始來個暴力優化期盼能過結果就多了10分70……
距離為2,也就是每次都會有個轉接點,於是我們就列舉這個轉接點。對於每個轉接點,有兩個點ab想接的話,就是2ab,三個點的話就是2ab,2ac,2bc。但是我們發現直接硬搞有些麻煩。所以我們來轉化一下,2ab=(a+b)^2-(a^2+b^2),2ab+2ac+2ac=(a+b)^2+2c(a+b)^2+c^2-(a^2+b^2+c^2)=(a+b+c)^2-(a^2+b^2+c^2)。就ac了
#include#include#include#define n 405000
#define p 10007
using namespace std;
int head[n],next[n],to[n],a[n];
int tot=0,n;
long long ans,maxx;
void add_edge(int x,int y)
int main()
if (max1*max2 > maxx) maxx=max1*max2;
ans=(ans+sum2*sum2-sum1)%p;
}printf("%lld %lld\n",maxx,ans);
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...