令$S_{x}$表示$x$支配的节点集合,可以暴力枚举$x$并求出$S_{x}$(删去$x$后从1开始dfs,复杂度为$o(nm)$),进而反过来即可求出受支配集$D_{x}$

结论1:若$z\in S_{x}\cap S_{y}$,则有$x\in S_{y}$或$y\in S_{x}$

由于$x$和$y$都支配$z$,那么考虑任意一条从1到$z$的简单路径,必然经过$x$和$y$(且恰好经过一次)

考虑两者经过的先后顺序,不妨假设先经过$x$,那么若$x$不支配$y$,即存在从1到$y$且经过$x$的简单路径,再从$y$到$z$即可,那么即与$x$支配$z$矛盾,反之类似,即得证

结论2(传递性):若$x\in S_{y}$,则$S_{x}\subset S_{y}$

(关于这个结论比较显然,严格包含是因为$y\in S_{y}$且$y\not\in S_{x}$)

综合上述两个结论,任意两个集合要么成严格包含关系,要么不交,即可构成一棵树形关系

更具体的,这棵树以1为根,且对于$x\ge 2$,令$x$的父亲$y$为满足$S_{x}\subset S_{y}$且$|S_{y}|$最小(可以证明唯一)

此时,对于一个节点$x$,其受支配集$D_{x}$即为其到根路径上所有节点

关于这棵树的求法,(求出$S_{x}$和$D_{x}$后)有以下暴力$o(n^{2})$的做法——

选择当前受支配集为空的节点$x$,对于所有$y\in S_{x}$的节点在$D_{y}$中删除$x$,并且$x$的父亲即为$D_{x}$中最后一个被删除的节点,以下记作$fa_{x}$

但暴力删除复杂度无法接受,直接记录$|D_{y}|$即可

当然,还有更为优秀的$o(n)$的做法,可以自行搜索支配树

求出支配树后,考虑询问插入$(x_{0},y_{0})$这条边时的情况——

结论3:若$D_{x}$变化,则$x$子树内所有节点受支配集均发生变化

由于是插入边$(x_{0},y_{0})$且初始1可以到达任意点,那么$D_{x}$变化必然是节点被删除

假设删除的是$y$,对于$x$子树内的节点$z$,显然也可以构造出不经过$y$到达$z$的路径,因此$y$也在$D_{z}$中被删除

由此,我们发现受支配集变化的一定是若干棵不交的子树,显然仅关心于子树的根,也即$D_{x}$发生变化但$D_{fa_{x}}$不发生变化的节点$x$

结论4:$D_{x}$变化且$D_{fa_{x}}$未发生变化,必然有$fa_{x}\notin D_{x}$(变化后的$D_{x}$)

反证法,假设$fa_{x}\in D_{x}$,那么$D_{x}$中被删除的节点$y$必然是$fa_{x}$的祖先(且不为$fa_{x}$自身),接下来对于从1到$x$且不经过$y$的路径,对其是否经过$fa_{x}$分类讨论——

(1)若其经过$fa_{x}$,那么$y$不再支配$fa_{x}$,与$D_{fa_{x}}$未变化矛盾

(2)若不经过$fa_{x}$,那么即存在从1到$x$且不经过$fa_{x}$的路径,与$fa_{x}\in D_{x}$矛盾

综上,即说明$fa_{x}\notin D_{x}$

同时,在满足这个条件时,$D_{x}$必然发生变化,因此只需要找出所有这样的$x$,并标记,之后再一次dfs统计所有到根路径上存在此类标记的节点即可

下面,即查询所有节点$x$,满足存在一条路径使得其不经过$fa_{x}$到达$x$,若不经过新边$(x_{0},y_{0})$显然不存在此类路径,因此也即要求存在从1到$x_{0}$和从$y_{0}$到$x$的路径,且都不能经过$fa_{x}$

同时,这两段都不能利用新边,那么第一个问题中也即要求$x_{0}$不能在$fa_{x}$的子树中,第二个问题对每一个$x$独立,也即对于原图的反图从$x$开始不经过$fa_{x}$能到达$y_{0}$

两者都可以预处理出来,之后即可$o(1)$判断每一个节点$x$是否满足这两个条件,复杂度为$o(nq)$

然而还是会被卡常, 因此还有下面复杂度更优秀的做法——

更进一步的,将询问排序后考虑相同的$y_{0}$,其限制了若干个点,同时$x_{0}$又限制了其到根以及其所有儿子不能选,那么令$f_{k}$表示$k$子树内仅考虑$k$子树内权值的答案,维护其到根路径的答案即可

时间复杂度降为$o(nm+q)$,可以轻松的通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 3005
4 struct Edge{
5 int nex,to;
6 }edge[N<<2];
7 queue<int>q;
8 vector<int>v[N],S[N];
9 int E,n,m,t,x,y,ans,head[2][N],vis[N],D[N],fa[N],dfn[N],sz[N],Vis[N][N];
10 void add(int p,int x,int y){
11 edge[E].nex=head[p][x];
12 edge[E].to=y;
13 head[p][x]=E++;
14 }
15 void dfs(int p,int k){
16 if (vis[k])return;
17 vis[k]=1;
18 for(int i=head[p][k];i!=-1;i=edge[i].nex)dfs(p,edge[i].to);
19 }
20 void dfs(int k){
21 dfn[k]=++dfn[0];
22 sz[k]=1;
23 for(int i=0;i<v[k].size();i++){
24 dfs(v[k][i]);
25 sz[k]+=sz[v[k][i]];
26 }
27 }
28 void calc(int k,int p){
29 if (vis[k])p=1;
30 if (p)ans++;
31 for(int i=0;i<v[k].size();i++)calc(v[k][i],p);
32 }
33 int main(){
34 scanf("%d%d%d",&n,&m,&t);
35 memset(head,-1,sizeof(head));
36 for(int i=1;i<=m;i++){
37 scanf("%d%d",&x,&y);
38 add(0,x,y);
39 add(1,y,x);
40 }
41 for(int i=1;i<=n;i++){
42 memset(vis,0,sizeof(vis));
43 vis[i]=1;
44 dfs(0,1);
45 for(int j=1;j<=n;j++)
46 if (!vis[j]){
47 S[i].push_back(j);
48 D[j]++;
49 }
50 }
51 q.push(1);
52 while (!q.empty()){
53 int k=q.front();
54 q.pop();
55 for(int i=0;i<S[k].size();i++){
56 fa[S[k][i]]=k;
57 if (--D[S[k][i]]==0)q.push(S[k][i]);
58 }
59 }
60 for(int i=2;i<=n;i++)v[fa[i]].push_back(i);
61 dfs(1);
62 for(int i=2;i<=n;i++){
63 memset(vis,0,sizeof(vis));
64 vis[fa[i]]=1;
65 dfs(1,i);
66 vis[fa[i]]=0;
67 memcpy(Vis[i],vis,sizeof(vis));
68 }
69 for(int i=1;i<=t;i++){
70 scanf("%d%d",&x,&y);
71 memset(vis,0,sizeof(vis));
72 for(int j=2;j<=n;j++){
73 if ((dfn[fa[j]]<=dfn[x])&&(dfn[x]<dfn[fa[j]]+sz[fa[j]]))continue;
74 if (Vis[j][y])vis[j]=1;
75 }
76 ans=0;
77 calc(1,0);
78 printf("%d\n",ans);
79 }
80 }

[loj3504]支配的更多相关文章

  1. POJ 3398 Perfect Service --最小支配集

    题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...

  2. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析) 非支配排序、分层 rank.c

    /* Rank assignment routine */ # include <stdio.h> # include <stdlib.h> # include <mat ...

  4. 康复计划#4 快速构造支配树的Lengauer-Tarjan算法

    本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...

  5. POJ 3398 Perfect Service(树型动态规划,最小支配集)

    POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...

  6. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  7. [HDU]4694 Important Sisters(支配树)

    支配树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  8. luogu2597-[ZJOI2012]灾难 && DAG支配树

    Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...

  9. HDU.4694.Important Sisters(支配树)

    HDU \(Description\) 给定一张简单有向图,起点为\(n\).对每个点求其支配点的编号和. \(n\leq 50000\). \(Solution\) 支配树. 还是有点小懵逼. 不管 ...

随机推荐

  1. Idea生成JavaDoc文档

    什么是JavaDoc javadoc是Sun公司提供的一个技术 它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档 实现方式 命令行方式 javadoc -encoding ...

  2. Oracle基础命令操作总结

    第1章 oracle命令集 1.1 重启数据库 1.1.1 启动数据库 su -root                 切换到oracle安装用户下,我的是root source .bash_pro ...

  3. 题解 2020.10.24 考试 T2 选数

    题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...

  4. Java(16)修饰符

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201619.html 博客主页:https://www.cnblogs.com/testero ...

  5. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...

  6. csh

    在*unix系统中,常用的shell有sh,bash,csh/tcsh, ksh.  sh来自于systemV的Unix,是传统的Unix的shell,直到现在很多的系统管理员仍然喜欢使用sh. ba ...

  7. Kali Linux修改root密码

    今天在官网下载了一个Kali虚拟机的压缩包, 解压缩后直接在VM中打开,点了好多次打开发现都打不开,查了一下说是没有关闭共享虚拟机,于是操作了一番: 编辑→首选项→共享虚拟机→选择禁用. 操作完之后果 ...

  8. [no code][scrum meeting] Alpha 3

    项目 内容 会议时间 2020-04-07 会议主题 技术规格说明书review 会议时长 1h30min 参会人员 产品经理+后端技术组长(伦泽标)+OCR竞品调研成员(叶开辉)+架构文档负责(黎正 ...

  9. FastAPI 学习之路(三十三)操作数据库

    通过创建pydantic模型进行验证提交数据 from pydantic import BaseModel class UserBase(BaseModel): email: str class Us ...

  10. 深入理解xLua基于IL代码注入的热更新原理

    目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题.另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一. 热更新可以 ...