poj1741 點分治 樹上點對)

2021-09-01 21:02:50 字數 730 閱讀 8804

題目大意:一顆樹,問由多少個點對(u,v)滿足dis(u,v)<=k

樹的點分治。。。求先求以重心為根的樹中滿足dis(u,v)<=k的點對數,減去重心為根的所有子樹中滿足條件的點對數,即為路徑經過重心的點對數,加起來即為答案。

每次對以重心為根的樹進行dfs,子樹大小減半,再以同樣的方式每棵dfs子樹,所以遞迴的深度為logn。每次查詢答案都要遍歷完其子樹每個點,所以對於每一層遞迴遍歷的結點總數為剩餘沒訪問過的點的總和,為n。由於遍歷完子樹所有結點後要對其深度排序,所以總時間複雜度為o(n*logn*logn)

**

#include#include#include#includeusing namespace std;

int m,root,siz[20010],dep[20010],vis[20010],ma[20010],a[20010],cnt,k;

int e,p[20010],nex[20010],head[20010],w[20010];

void add(int a,int b,int c)

void dfsroot(int u,int fa,int sum)

return ans;

}void dfs(int u,int fa)

}}int main()

cnt=0;

dfs(1,0);

printf("%d\n",cnt);

}return 0;

}

poj1741(樹上點分治)

題解 樹上分治就是一直找重心,然後計算經過重心點的答案有多少,接著再把重心這個點刪除掉然後接著在對應子樹上接著重複上面步驟直到沒有孩子結點。我是根據下面這篇部落格學習的 include include include include include include include include i...

POJ 1741 點分治詳解

題意 給出乙個n 1e4 個點的樹,每條邊有權,求樹上長度小於等於k的路徑條數。u,v 和 v,u 算兩條。點分治 顧名思義,點分治就是對點進行分治,一般用於路經統計問題。對每個點而言,一條路徑要麼經過他,要麼不經過他,這就是分,即分成路徑經過此點和不經過此點。基本思想是 當經過某點的路徑可以比較方...

POJ1741 點分治模板

傳送門 求樹上兩點間路徑長度小於k的點對個數 參考資料 守望的澱粉質略解 粉紅兔大佬的澱粉質 演算法步驟 計算重心位置 計算答案 分治子問題繼續求解 1 3 include include include include include include include include include...