聯合權值(codevs 3728)

2022-05-15 03:47:21 字數 1541 閱讀 8787

無向連通圖 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取餘。

5

1 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保證一定存在可產生聯合權值的有序點對。

/*

剛開始用的三重迴圈,華麗麗的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;

}

view code

聯合權值(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 資料範圍及提...