無向連通圖 gg 有 nn 個點,n-1n−1 條邊。點從 11 到 nn 依次編號,編號為 ii 的點的權值為 w_iwi,每條邊的長度均為 11。圖上兩點 (u, v)(u,v) 的距離定義為 uu 點到 vv 點的最短距離。對於圖 gg 上的點對 (u, v)(u,v),若它們的距離為 22,則它們之間會產生w_v \times w_uwv×wu 的聯合權值。
請問圖 gg 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
輸入格式:
第一行包含 11 個整數 nn。
接下來 n-1n−1 行,每行包含 22 個用空格隔開的正整數 u,vu,v,表示編號為 uu 和編號為 vv 的點之間有邊相連。
最後 11 行,包含 nn 個正整數,每兩個正整數之間用乙個空格隔開,其中第 ii 個整數表示圖 gg 上編號為 ii 的點的權值為 w_iwi。
輸出格式:
輸出共 11 行,包含 22 個整數,之間用乙個空格隔開,依次為圖 gg 上聯合權值的最大值和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對1000710007取餘。
輸入樣例#1:複製
5
1 2
2 33 4
4 5
1 5 2 3 10
輸出樣例#1:複製
本例輸入的圖如上所示,距離為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 < n \leq 1001對於60%的資料,1 < n \leq 20001對於100%的資料,1 < n \leq 200000, 0 < w_i \leq 100001保證一定存在可產生聯合權值的有序點對。
30p:floyd列舉出兩個點的距離,再列舉兩個點o(n^3)
60p:距離就2,就兩種情況:乙個點是另乙個點的祖先,或者兩個點的父親一樣,所以可以列舉兩個點,o(1)暴力判斷
100p:列舉中間點,只用知道所以與它直接連線的點,用鏈式前向心存一下均攤o(1),
答案為w1*w1+w1*w2+……w1*wn+w2*w1+w2*w2+……
=sumw*sumw-sum(w^w)
#include#includeconst int p=10007;
using namespace std;
int read()
const int n=1e6+5;
int n,ans,mx,w[n],d1,d2,s1,s2;
int cnt,he[n],to[n],nxt[n];
inline void add(int u,int v)
int main()
mx=max(mx,d1*d2);
ans=(ans+s1*s1-s2)%p;
}printf("%d %d\n",mx,ans);
return 0;
}
Luogu P1351 聯合權值
無向連通圖g有n個點,n 1條邊,點從1到n依次編號,編號為i的點的權值為wi每條邊的長度均為1圖上兩點 u,v 的距離定義為u點到v點的最短距離。對於圖g上的點對 u,v 若它們的距離為2,則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所...
luoguP1351 聯合權值
題目描述 無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的...
Luogu P1351 聯合權值 字首和
求樹上距離為二的點對權積之最值 和。70pts 列舉每個點,bfs兩層求和求最值和和。100pts 列舉每個點,先統計所有可達節點的權值和,再列舉可達點求權值和 第二種做法較第一種的優化 a1 a2 a1 a3 a1 a4 a2 a1 a2 a3 a1 sum a1 a2 sum a2 好巧妙啊 要...