12tqian's Competitive Programming Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub 12tqian/cp-library

:heavy_check_mark: library/graphs/centroid-decomposition.hpp

Verified with

Code

#pragma once

struct CentroidDecomposition {
	int n;
	std::vector<std::vector<int>> g, cg; // cg is directed tree for centroids

	std::vector<bool> vis;
	std::vector<int> size;
	std::vector<int> parent;
	int root;

	void init(int n_) {
		n = n_;
		g.assign(n, std::vector<int>());
		cg.assign(n, std::vector<int>());
		vis.assign(n, false);
		parent.assign(n, 0);
		size.assign(n, 0);
	}

	void ae(int u, int v) {
		g[u].push_back(v);
		g[v].push_back(u);
	}

	void dfs_size(int src, int par = -1) {
		size[src] = 1;
		for (int nxt : g[src]) {
			if (nxt == par || vis[nxt]) 
				continue;
			dfs_size(nxt, src);
			size[src] += size[nxt];
		}
	}

	int get_centroid(int src) {
		dfs_size(src);
		int num = size[src];
		int par = -1;
		do {    	
			int go = -1;
			for (int nxt : g[src]) {
				if (nxt == par || vis[nxt])
					continue;
				if (2 * size[nxt] > num) 
					go = nxt;
			}
			par = src;
			src = go;
		} while (src != -1);
		return par;
	}

	int build_dfs(int src, int par = -1) {
		int c = get_centroid(src);
		vis[c] = true;
		parent[c] = par;
		if (par != -1) {
			cg[par].push_back(c);
		}
		for (int nxt : g[c]) {
			if (vis[nxt]) 
				continue;
			build_dfs(nxt, c);
		}
		return c;
	}

	void build() {
		root = build_dfs(0);
	}
};  
struct CentroidDecomposition {
	int n;
	std::vector<std::vector<int>> g, cg; // cg is directed tree for centroids

	std::vector<bool> vis;
	std::vector<int> size;
	std::vector<int> parent;
	int root;

	void init(int n_) {
		n = n_;
		g.assign(n, std::vector<int>());
		cg.assign(n, std::vector<int>());
		vis.assign(n, false);
		parent.assign(n, 0);
		size.assign(n, 0);
	}

	void ae(int u, int v) {
		g[u].push_back(v);
		g[v].push_back(u);
	}

	void dfs_size(int src, int par = -1) {
		size[src] = 1;
		for (int nxt : g[src]) {
			if (nxt == par || vis[nxt]) 
				continue;
			dfs_size(nxt, src);
			size[src] += size[nxt];
		}
	}

	int get_centroid(int src) {
		dfs_size(src);
		int num = size[src];
		int par = -1;
		do {    	
			int go = -1;
			for (int nxt : g[src]) {
				if (nxt == par || vis[nxt])
					continue;
				if (2 * size[nxt] > num) 
					go = nxt;
			}
			par = src;
			src = go;
		} while (src != -1);
		return par;
	}

	int build_dfs(int src, int par = -1) {
		int c = get_centroid(src);
		vis[c] = true;
		parent[c] = par;
		if (par != -1) {
			cg[par].push_back(c);
		}
		for (int nxt : g[c]) {
			if (vis[nxt]) 
				continue;
			build_dfs(nxt, c);
		}
		return c;
	}

	void build() {
		root = build_dfs(0);
	}
};  
Back to top page