20160804 最長鏈 樹分治?樹DP?

2021-07-16 08:12:05 字數 978 閱讀 9262

題目大意:給一顆樹,求每個節點到其他所有節點的距離中最大的

使用dfs序和節點size維護乙個點的子樹,對於每個節點,只考慮過這個點的路徑,則可以用最長子鏈更新所有非最長鏈所在子樹的所有節點,用次長子鏈更新最長鏈所在子樹的所有節點。注意,為防止只有一條鏈,每個節點ans值的初值應是深度(向上一條鏈)或最長子鏈(向下一條鏈)中大的。然後返回最長子鏈的長度(要加上父節點到他的邊權)以留給他的父親決定最長子鏈時使用。

自己的**:

#include

#include

#include

#define gm 10001

using namespace std;

struct e

;}*f[gm];

int fat[gm],ord[gm],sz[gm],dpt[gm],ans[gm],pos[gm];

int now=0;

int dfs(int

x) else

if(z>more) more=z;

sz[x]+=sz[y];

}ans[x]=dpt[x];

if(ans[x]x]=most;

if(!more) return most;

int k=beg+sz[ord[beg]],w;

for(int i=pos[x],j=pos[x]+sz[x];iord[i];

if(i>=beg&&iif(ans[w]x]+more)

ans[w]=dpt[w]-dpt[x]+more;

}else

}return most;

}int n;

int main()

int r=rand()%n+1;

dfs(r);

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

printf("%d\n",ans[i]);

return

0;}

基環樹的最長鏈

本題給定幾個基環樹的森林,求每棵基環樹的直徑長度之和 思路 先單獨考慮一棵基環樹,先dfs找環 也可tarjan 先把每個環上的點向外擴充套件,找出它們每棵子樹的直徑,用樹型dp處理,接著拆環成鏈,再複製一倍的鏈長,在環上跑,用單調佇列維護即可,但是維護前還需要預處理下直徑字首和,否則會爆時間。來自...

分治入門 樹分治

分治思想 劃分子問題,解決子問題,合併子問題 題目 poj1741 題意 給定一棵含有n個節點的無向帶權樹,滿足距離 k的兩點共有多少對?n 1e4 題解 1 首先找到樹a的重心,重心指的是乙個節點,將該節點刪去之後剩下的最大子樹的節點數最小 將其作為樹a的根。在數列的分治之中我們是直接去區間的中間...

點分治(樹分治)

將原問題分解成若干相同形式,相互獨立的子問題,各個擊破 一般用來解決有關樹上路徑的統計和詢問 p4178 tree 給定一棵 n 個節點的樹,每條邊有邊權,求出樹上兩點距離小於等於 k 的點對數量。暴力做法 o n2 點分治做法 選擇乙個點作為分治中心,令其為rt做dfs。對於一條路徑path u,...