題目大意:給一顆樹,求每個節點到其他所有節點的距離中最大的
使用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,...