無向連通圖 g 有 n 個點,n−1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 (u,v) 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 (u,v),若它們的距離為 2,則它們之間會產生wv×wu 的聯合權值。
請問圖 g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
第一行包含 1 個整數 n。
接下來 n−1 行,每行包含 2 個用空格隔開的正整數 u,v,表示編號為 u 和編號為 v 的點之間有邊相連。
最後 1 行,包含 n 個正整數,每兩個正整數之間用乙個空格隔開,其中第 i 個整數表示圖 g 上編號為 i 的點的權值為 wi。
輸出共 1 行,包含 2 個整數,之間用乙個空格隔開,依次為圖 g 上聯合權值的最大值和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007取餘。
51 22 3
3 44 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對於60%的資料,1對於100%的資料,1保證一定存在可產生聯合權值的有序點對。
/*view code剛開始用的三重迴圈,華麗麗的tle了,70分 (⊙o⊙) !!!
正解:列舉每個點,這個點所連線的任意兩點的距離為2,把它們都放到乙個陣列裡,取最大的兩個數相乘即為當前最優解,對於所有點取大;至於權值和,補充乙個數學知識:
(a+b+c)^2=a*a+b*b+c*c+2ab+2ac+2bc, 2ab+2ac+2bc即為當前和,對於所有點取和。
*/#include
#include
#include
#include
#include
#define m 200010
using
namespace
std;
vector
grap[m];
intn,a[m],q[m];
int cmp(const
int x,const
inty)
intmain()
for(int i=1;i<=n;i++)
scanf("%d
",&a[i]);
int sum=0,maxn=0
;
for(int i=1;i<=n;i++)
sort(q+1,q+cnt+1
,cmp);
maxn=max(maxn,a[q[1]]*a[q[2
]]);
sum+=x*x-y;
sum=(sum+10007)%10007
; }
}printf(
"%d %d
",maxn,sum);
return0;
}
聯合權值(codevs 3728)題解
問題描述 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為wi 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wu wv 的聯合權值。請問圖 g 上所...
3728 聯合權值
無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中...
3728 聯合權值
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 題目描述 description 輸入描述 input description 輸出描述 output description 樣例輸入 sample input 樣例輸出 sample output 資料範圍及提...