點分治模板題

2022-06-03 06:39:09 字數 1140 閱讀 1769

#includeusing

namespace

std;

const

int maxn=2e4+10

;int

head[maxn],ver[maxn],nxt[maxn],edge[maxn];

inttot;

int vis[maxn]; //

分治時用來標記哪個重心已經使用過

intans,size[maxn],root,sum;

//求重心時使用,ans記錄目前標記重心最小子樹大小,size記錄子樹大小 ,root為重心,sum為目前該分治的子樹大小

//mapm;

int m[100000000],mcnt,mm[maxn]; //

m[i]用來標記每個子節點到根的距離為i是否存在,mm用來清空m時用不然會t。

int dis[maxn],bian[maxn],cnt; //

dis[i]記錄子節點到目前根的距離,bian記錄每個存在的距離

int q[1005],judge[1005

];

intn,k;

void add(int x,int y,int

z)void dfs_find(int x,int fa) //

求重心

max_part=max(max_part,sum-size[x]);

if(ans>max_part)

}void dfs(int x,int

fa)

}void solve(int x) //

分治為子樹解決,每次給乙個子樹的重心。

for(int j=1; j<=cnt; j++)

}for(int i=1;i<=mcnt;i++)

m[mm[i]]=0;}

void divide(int x) // 劃分子樹

}int

main()

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

scanf("%d

",&q[i]);

ans=sum=n;

dfs_find(

1,0);

divide(root);

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

}

點分治模板

luogu 3806 近些日子學了點分治,當然只是學了個模板。所謂點分治,使用於處理樹上路徑的一種分治手段。因為利用了重心的性質,時間複雜度可以保證呢。所謂演算法流程 選取當前子樹的重心 計算路徑總數,不管路徑是否過當前重心 後面會去重 計算起點和終點在同一顆子樹中的合法路徑 因為這條路徑不是簡單路...

點分治模板

這兩天跟著學了一手樹上點分治模板,然後有一些感悟,決定來寫一發部落格.首先,鑑於鄙人的經驗,如果想要較快速地學習乙個新演算法,肯定還是先看一道經典的例題比較好,所以我們先來一道例題.給你一棵tree,以及這棵樹上邊的距離.問有多少對點它們兩者間的距離小於等於k 輸入格式 n n 40000 接下來n...

點分治模板

bzoj1316 由於之前板子寫得太爛了,今天把它重新整理改進了一下 vis表示每個點是否已經當過根,所以注意dfs,findroot函式的計算過程中是不會對vis進行修改的 修改時只需要考慮對dfs和solve中的有關位置進行修改即可,其它部分基本不變 include using namespac...