bzoj 2815(LCA+拓扑排序)(灭绝树)

传送门

题意:

在一个DAG中,问一个点是多少个点的支配点?

题解:

好像灭绝树就是因为这题被发明的。在DAG上拓扑排序时,通过在反图上倍增计算所有前驱的LCA,在新图(灭绝树)中add_edge(LCA,当前点)。最后对于每个点输出它在灭绝树上的子树大小-1(自己不算)。

#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN=65540;
vector g[MAXN],rg[MAXN],mg[MAXN];
int n,ind[MAXN],siz[MAXN];
int pre[MAXN],tot;
inline int read() {
	int x=0;char c=getchar();
	while (c<'0'||c>'9') c=getchar();
	while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x;
}
int f[18][MAXN],dep[MAXN];
inline int lca(int x,int y) {
	if (dep[x] q;
	while (!q.empty()) q.pop();
	g[0].clear(),mg[0].clear(),dep[0]=0;
	for (register int i=1;i<=n;++i)
		if (!ind[i]) q.push(i),dep[i]=1,g[0].push_back(i),rg[i].push_back(0),f[0][i]=0;
	while (!q.empty()) {
		tot=0;
		int cur=q.front();
		q.pop();
		for (int i=0;i%d\n",anc,cur);
		mg[anc].push_back(cur);
		for (int i=1;i<18;++i) f[i][cur]=f[i-1][f[i-1][cur]];
		for (int i=0;i


你可能感兴趣的:(数据结构)