2019 Multi-University Training Contest 3 B 支配树
题意:给出衣服有向无环图(DAG),,定义出度为0的点为中心城市,每次询问给出两个点,求破坏任意一个城市,使得这两个点至少有一个点无法到达中心城市,求方案数。
思路:首先建立反向图,将城市到若干个终点看成从若干个起点出发到某个城市,再用一个源点连接那些度为0 的点,即可看成从源点出发到某个城市。要炸掉一个点使得无法到达某个城市,那么需要炸掉的是从源点到该城市的必经点,考虑建立支配树,根据定义可知支配树到根的链上结点个数就是必经点的个数。两个城市的容斥减去 LCA 到根上这条链即可。由于保证是 DAG ,因此直接按拓扑序建树即可,建完树利用结点的 depth 来求点到根的链长,注意最后答案要减去一开始添加的源点。
DAG支配树求法:先求拓扑序,按照拓扑序处理(建树)。对于一个点,所有能到达它的点在支配树中的lca,就是它支配树中的父亲。由于能到达他的点拓扑序必定比他本身小,所以肯定已经在建好的支配树上了,必定能求出lca。
现在还不会非DAG的支配树,学习博客为 https://wenku.baidu.com/view/b06471d019e8b8f67d1cb91b.html
#include<bits/stdc++.h>
#define pb(a) push_back(a)
#define clr(a) memset(a, 0, sizeof(a))
using namespace std;
const int maxn = 1e5 + ;
vector<int >ve[maxn],rve[maxn];
int n,m,T;
int deg[maxn],dep[maxn],id[maxn],tot;
int f[maxn][];
int rt=n+;
void bfs(){
rt=n+;
queue<int >q;
for(int i=;i<=n;i++){
if(!deg[i]){
q.push(i);
ve[i].pb(rt);
rve[rt].pb(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
id[++tot]=u;
int si=rve[u].size();
for(int i=;i<si;i++){
int v=rve[u][i];
if((--deg[v])==){
q.push(v);
}
}
}
}
int LCA(int x,int y){
if(dep[x]>dep[y])swap(x,y);
for(int i=;i>=;i--){
if(dep[y]>dep[x]&&dep[x]<=dep[f[y][i]])y=f[y][i];
}
for(int i=;i>=;i--){
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
}
return x==y?x:f[x][];
}
int main(){
cin>>T;
while(T--){
cin>>n>>m;
for(int i=;i<=n+;i++){
ve[i].clear(),rve[i].clear();
deg[i]=dep[i]=;
}
tot=;
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
ve[u].pb(v);
rve[v].pb(u);
deg[u]++;
}
bfs();
dep[rt]=;
for(int i=;i<=n;i++){
int fa=-;
int u=id[i];
int si=ve[u].size();
for(int j=;j<si;j++){
int v=ve[u][j];
fa=(fa==-)?v:LCA(fa,v);
}
dep[u]=dep[fa]+;
f[u][]=fa;
for(int j=;j<=;j++){
f[u][j]=f[f[u][j-]][j-];
}
}
int q,u,v;
cin>>q;
while(q--){
scanf("%d%d",&u,&v);
int lca=LCA(u,v);
printf("%d\n",dep[u]+dep[v]-dep[lca]-);
}
}
}
2019 Multi-University Training Contest 3 B 支配树的更多相关文章
- 2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...
- 2019 Nowcoder Multi-University Training Contest 1 H-XOR
由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...
- 2016 Multi-University Training Contest 4 Bubble Sort(树状数组模板)
Bubble Sort 题意: 给你一个1~n的排列,问冒泡排序过程中,数字i(1<=i<=n)所到达的最左位置与最右位置的差值的绝对值是多少 题解: 数字i多能到达的最左位置为min(s ...
- hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...
- 2019 Multi-University Training Contest 8
2019 Multi-University Training Contest 8 C. Acesrc and Good Numbers 题意 \(f(d,n)\) 表示 1 到 n 中,d 出现的次数 ...
- 2019 Multi-University Training Contest 7
2019 Multi-University Training Contest 7 A. A + B = C 题意 给出 \(a,b,c\) 解方程 \(a10^x+b10^y=c10^z\). tri ...
- 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...
- 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...
- 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...
随机推荐
- 拾遗:关于“尾递归”- tail recursion
定义[个人理解]: 尾递归,即是将外层得出的常量计算因子,以函数参数的形式逐层向内传递,即内层调用整合外层调用的产出,整个递归的结果最终由最内层的一次函数调用得出:而通常的递归则是外层调用阻塞.等待内 ...
- centos7下利用nfs搭建wordpress
拓扑环境 web1 192.168.198.110 web2 192.168.198.120 mysql 192.168.198.130 DNS 192.168.198.10 NFS 192.168. ...
- python实现马赛克拼图!
python实现马赛克拼图 直接上代码! 代码如下: #!/usr/local/bin/python3# --*-- coding:utf8 --*-- import getoptimport sy ...
- qt创建无qt工程
qt创建无qt工程,cmake . eclipse 编写makefile 代码
- 笔记56 Mybatis快速入门(七)
相关概念介绍(二) 6.一级缓存 <1>在一个session里查询相同id的数据 package mybatis.annotation; import java.io.IOExceptio ...
- Linux 错误: $'\r': command not found
是linux无法解析$'\r'.这其实是windows与linux系统的差异导致的. 因为linux上的换行符为\n,而windows上的换行符为\r\n.所以脚本到linux上就无法解析了. 通常的 ...
- 关于mybaitis
mybatis启动流程 1.首先来看看最简单的mybatis项目启动过程 public static void mybatisTest() throws IOException { String re ...
- PHP mysqli_affected_rows() 函数
实例 从不同的查询中输出所影响记录行数: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localh ...
- JavaWeb学习篇之----Tomcat中配置数字证书以及网络传输数据中的密码学知识
今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一下Tomcat中配置数字证书的相关内容,但是在说这部分内容的时候,我们貌似得先说一下数字证书的相关概念,那说到数字证书的时候我们还得了解一些 ...
- .net API跨域
在webconfig中的节点 <system.webServer> </system.webServer> 下添加 <httpProtocol><custom ...