P1351 聯合權值 樹形結構

2021-08-28 03:37:22 字數 772 閱讀 5553

評測記錄:

一棵樹,每個點有權值,求兩個距離為2的點使權值之積最大和所以這種點對的權值之積的和。

分為兩種情況:

1.乙個點是另乙個點的爺節點,這時候在遍歷時儲存爺節點就好了。

2.乙個點是另乙個點的兄弟,這時候在乙個點跑兒子的時候計算就好。

#include

#include

#define n 200010

#define ll long long

using namespace std;

struct linea[n*2];

ll n,x,y,maxs,ls[n],tot,w[n],ans;

void addl(ll x,ll y)

void dp(ll x,ll fa1,ll fa2)//第一種情況

}void dp2(ll x,ll fa)//第二種情況

if(w[y]>max1) swap(max1,max2),max1=w[y];

else

if(w[y]>max2) max2=w[y];

}maxs=max(maxs,max1*max2);

}int main()

for(ll i=1;i<=n;i++)

scanf("%lld",&w[i]);

dp(1,0,0);

dp2(1,0);

printf("%lld

%lld",maxs,ans*2

%10007);

}

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的乘積就是它和這之前所有的點的乘積...