支配树的定义:
问题:我们有一个有向图(可以有环),定下了一个节点为起点s。现在我们要求:从起点s出发,走向一个点p的所有路径中,必须要经过的点有哪些{xp}。
换言之,删掉{xp}中的任意一个点xpi以及它的入边出边,都会使s无法到达p。
对于DAG的解法:
1.拓扑排序
2.求LCA,建树。
3.统计信息。
我的代码:JZOI灾难 题目要求的就是每个点能够支配的点的个数。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb(x) push_back(x)
const int N = 3e5+5;
const int sz = 18;
int a[N];
struct node
{
int to,nt;
}g[N];
int tot;
int head[N];
void addedg(int u,int v)
{
g[tot].to=v;
g[tot].nt=head[u];
head[u]=tot++;
}
vector<int>v[N],v1[N],v2[N];
int in[N];
void topsort(int n)
{
queue<int>q;
for(int i=1; i<=n; i++)
if(in[i]==0)q.push(i);
int cnt=0;
while(!q.empty())
{
int u=q.front();
q.pop();