無向連通圖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:1 2
2 33 4
4 5
1 5 2 3 10
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 。
題解:bfs,以每個點為中心,它兒子的距離都為2
求最大值只需找前兩大的w,求和可以用sum=(a1+a2+a3+......+an)^2-a1^2-a2^2-......-an^2
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8#define rg register
9#define ll long long
10using
namespace
std;
1112
const
int maxn = 200010;13
const
int maxm = 200010;14
const
int mod = 10007;15
1617
intn,ans1,ans2;
18int nxt[maxm*2],to[maxm*2
],h[maxn],e_num,w[maxn];
19bool
vis[maxn];
2021 queueq;
2223
void add(int x, int y)
2425
void
bfs()
37 sum=sum*sum;
38for(int i=h[u]; i; i=nxt[i])
42 sum%=mod;
43 ans1=max(ans1,mx1*mx2),ans2+=sum,ans2%=mod;44}
45}4647
intmain()
54for(int i=1; i<=n; i++) scanf("
%d", &w[i]);
55bfs();
56 ans2%=mod;
57 printf("
%d %d
", ans1, ans2);
58return0;
59 }
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...