洛谷P1351 聯合權值

2021-08-09 15:31:28 字數 2082 閱讀 1111

無向連通圖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 33 4

4 5

1 5 2 3 10

輸出樣例#1:

本例輸入的圖如上所示,距離為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 。

一看到題目就知道,這是乙個樹形結構。。。

神一般的題……

經過了一整天的冥思苦想,終於ac了。

下面是思路:(99.9% 都是自己想出來,0.1% 是看了題解才知道有注意事項。。。)

1、聯合的兩個節點距離為二,所以必定有乙個中轉點。所以,我們可以列舉每乙個中轉點。

2、假設每個中轉點周圍有兩個點,權值分別為a、b,則聯合權值為2ab=(a+b)^2-(a^2+b^2)。

3、若有三個點,權值分別為a、b、c,則聯合權值為2ab+2bc+2ac=(a+b+c)^2-(a^2+b^2+c^2)。

4、綜上,以某個節點為中轉點的聯合權值之和等於權值和的平方減去權值的平方和。(+1!!!!!)

5、為了找到最大的聯合權值,只需找到周圍最大的兩個權值max1,max2,相乘判斷即可。

注意:雖然題目讓%10007,但最大聯合權值是不能%10007的!!!

附**:

#include#include#include#define mod 10007

#define maxn 200010

using namespace std;

int n,c=1;

int head[maxn],num[maxn];

long long ans=0,maxn=0;

struct nodea[maxn<<1];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void add(int x,int y)

int main()

else if(num[t]>maxn2)maxn2=num[t];

s1+=num[t];s2+=(long long)num[t]*num[t];

s1%=mod;s2%=mod;

}s1=s1%mod*s1%mod;

ans=(ans+s1-s2+mod)%mod;

maxn=max(maxn,maxn1*maxn2);

}printf("%lld %lld\n",maxn,ans);

return 0;

}

P1351 聯合權值

無向連通圖g有n個點,n 1 條邊。點從1到n依次編號,編號為i的點的權值為w i 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu的聯合權值。請問圖 g上所有可產生聯合權值的有序點對中,聯...

P1351 聯合權值

然而這只是一道普及 提高的大水題 洛谷鏈結 這道題是2014年提高組day1的第二題。簡單題意就是在樹上每個點都有權值,相鄰兩點的距離為1,求距離為2的點的權值乘積的和以及最大值。基本思路就是遍歷整棵樹,然後找到距離該點距離為2的點,計算距離,更新最大值和乘積和。但這樣就很慢了。所以我們可以遍歷中間...

P1351 聯合權值

為了寫一寫lca,我就按照標籤找 結果這道題我寫完竟然沒用lca 真是神奇。很多人 包括我 首先就想到了要列舉每乙個點,再列舉任意這個點的兩個兒子,可是顯然o n2 會t 其實我們只要線性掃一遍就可以了,利用小學學到的乘法分配率,邊走邊加val,這樣下乙個點和val的乘積就是它和這之前所有的點的乘積...