題目大意:給出一棵 n 個節點的樹,現在定義 dis( x , y ) 為點 x 和點 y 之間的路徑長度,現在問 dis ( x , y ) <= k 的點對有多少
題目分析:點分治的模板題目,乾貨部落格:
自己寫的時候寫了一堆bug。。提示一下,如果是wa的話可能有點無從下手,但如果用的是鏈式前向星,還仍然 tle 的話,大概率是重心的地方出現細節問題了,因為如果重心使用不當,會將時間複雜度退化為 n*n*logn
**:
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int n=1e4+100;
int ans,root,tsize,wt[n],sz[n],path[n],tot,cnt,n,k;
int nt[n<<1],to[n<<1],w[n<<1],head[n];
bool vis[n];
void addedge(int u,int v,int val)
void get_root(int u,int fa)
wt[u]=max(wt[u],tsize-sz[u]);
if(wt[root]>wt[u])
root=u;
}void get_path(int u,int fa,int deep)
}int calc(int u,int deep)
return ans;
}void solve(int u)
}void init(int n)
int main()
get_root(1,-1);
solve(root);
printf("%d\n",ans);
} return 0;
}
樹形 點分治 POJ 1741 Tree
通道 題意 有多少對 u,v 的距離小於k 思路 將無根樹轉化成有根樹進行觀察。滿足條件的點對有兩種情況 兩個點的路徑橫跨樹根,兩個點位於同一顆子樹中。如果我們已經知道了此時所有點到根的距離a i a x a y k的 x,y 對數就是結果,這個可以通過排序之後o n 的複雜度求出。然後根據分治的思...
POJ 1741 Tree 樹的分治 點分治
題目大意 給出一顆無根樹和每條邊的權值,求出樹上兩個點之間距離 k的點的對數。思路 樹的點分治。利用遞迴和求樹的重心來解決這類問題。因為滿足題意的點對一共只有兩種 1.在以該節點的子樹中且不經過該節點。2.路徑經過該節點。對於第一種點,我們遞迴處理 第二種點,我們可以將所有子樹的節點到這個子樹的根節...
poj 1741 tree 樹的點分治
很經典的點分治入門題 參考 其實還是有很多種姿態來搞,各個題解也都很清楚,差不多也就是那麼個意思,所以只是來總結一下需要注意和難以理解的東西 1.為什麼每次要找重心?給定的樹並不確定,所以樹的深度直接影響時間複雜度 因為你每一次都需要去找經過這乙個節點且兩點之間距離 k的,即是 i,j d i d ...