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 ...
随机推荐
- LeetCode 复制带随机指针的链表
题目链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/ 题目大意 略. 分析 空间复杂度 O(1) 的做法非常开拓思维 ...
- Java标准输入/输出/错误流
只要使用OutputStream对象就可使用System.out和System.err对象引用.只要可以使用InputStream对象就可以使用System.in对象. System类提供了三个静态设 ...
- Java8向后兼容
toInstant()方法被添加到可用于将它们转换到新的日期时间的API原始日期和日历对象.使用ofInstant(Insant,ZoneId)方法得到一个LocalDateTime或ZonedDat ...
- js小项目:显示与输入的内容相关的
1,添加键盘抬起事件 2,获取文本框的内容,是否与数组中的内容匹配 3,创建元素 <!DOCTYPE html> <html lang="en"> < ...
- WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置
来自: http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...
- 借用数组对象的prototype给数组扩充降维方法
原理:只要是一个对象,他都有一个prototype原型对象,保存共有的属性和方法. <!DOCTYPE html> <html lang="en"> < ...
- webpack初始化
1. 安装node js 2. 安装npm 3. 在桌面新建一个文件夹 4.利用cmd 进入文件夹 5.在cmd中创建一个新文件夹并且进入 6.npm init -y 生成page.json 7. ...
- apache httpd.conf alias
参考 Apache alias目录配置 我的环境是 Ubuntu apache2,配置文件目录在 /etc/apache2/sites-available/000-default.conf 在这个配置 ...
- Go 动态类型声明
Go 动态类型声明 package main import "fmt" func main() { var x float64 = 20.0 y := 42 fmt.Println ...
- PDO基础
//PDO:数据访问抽象层 $dsn = "mysql:dbname=mydb;host=localhost";//造PDO对象 $pdo = new PDO($dsn," ...