题意:给定一个n点m边的DAG,将只有入边的点称为周驿东点

q次询问,每次给定a,b两点,询问删去某个点x和其相连的所有边,能使a,b至少其中之一不能到达任何周驿东点的x的个数

n,q<=1e5,m<=2e5

思路:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
#define N 210000
#define M 1100000
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e14; vector<int> dom[N],be[N];
int f[N][],head[N],vet[N],nxt[N],dep[N],ind[N],
id[N],semi[N],p[N],pa[N],dfn[N],idom[N],mn[N],tot,cnt; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u)
{
dfn[u]=++cnt; id[cnt]=u;
int e=head[u];
while(e)
{
int v=vet[e];
if(!dfn[v])
{
dfs(v);
pa[dfn[v]]=dfn[u];
}
be[dfn[v]].push_back(dfn[u]);
e=nxt[e];
}
} int get(int x)
{
if(p[x]!=p[p[x]])
{
if(semi[mn[x]]>semi[get(p[x])]) mn[x]=get(p[x]);
p[x]=p[p[x]];
}
return mn[x];
} void LT()
{
per(i,cnt,)
{
for(int j:be[i]) semi[i]=min(semi[i],semi[get(j)]);
dom[semi[i]].push_back(i);
int x=p[i]=pa[i];
for(int y:dom[x]) idom[y]=(semi[get(y)]<x?get(y):x);
dom[x].clear();
}
rep(i,,cnt)
{
if(idom[i]!=semi[i]) idom[i]=idom[idom[i]];
dom[id[idom[i]]].push_back(id[i]);
}
} void getdep(int u,int fa)
{
rep(i,,) f[u][i]=f[f[u][i-]][i-];
int e=head[u];
while(e)
{
int v=vet[e];
if(v!=fa)
{
f[v][]=u;
dep[v]=dep[u]+;
getdep(v,u);
}
e=nxt[e];
}
} int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
int d=dep[x]-dep[y];
rep(i,,)
if((d>>i)&) x=f[x][i];
per(i,,)
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
if(x==y) return x;
return f[x][];
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int cas=read();
while(cas--)
{
int n=read(),m=read();
tot=;
rep(i,,n+) head[i]=ind[i]=dfn[i]=id[i]=idom[i]=;
rep(i,,m)
{
int x=read(),y=read();
add(y,x);
ind[x]++;
}
int root=n+;
rep(i,,n)
if(!ind[i]) add(root,i);
rep(i,,root)
{
dfn[i]=;
dom[i].clear();
be[i].clear();
p[i]=mn[i]=semi[i]=i;
}
cnt=;
dfs(root);
LT();
tot=;
rep(i,,root) head[i]=;
rep(i,,root)
if(id[idom[i]]) add(id[idom[i]],id[i]);
rep(i,,root) dep[i]=;
getdep(root,);
int q=read();
while(q--)
{
int x=read(),y=read();
int t=lca(x,y);
printf("%d\n",dep[x]+dep[y]-dep[t]);
}
} return ;
}

【HDOJ6604】Blow up the city(支配树)的更多相关文章

  1. Blow up the city

    Blow up the city 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Country A and B are at war. Country A needs to organ ...

  2. Day10 - C - Blow up the city HDU - 6604

    Country A and B are at war. Country A needs to organize transport teams to deliver supplies toward s ...

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

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

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

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

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

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

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

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

  7. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  8. 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...

  9. [BZOJ2815][ZJOI2012]灾难(拓扑排序/支配树)

    支配树目前只见到这一个应用,那就不独分一类,直接作为拓扑排序题好了. 每个点向所有食物连边,定义fa[x]为x的支配点,即离x最近的点,满足若fa[x]灭绝,则x也要灭绝. 这样,将fa[x]向x连边 ...

  10. 51nod2004 终结之时 (支配树+树剖+树链的并)

    link 我永远喜欢洛天依 给定一张图世末积雨云,你需要维护其支配树: 单点修改,子树修改,树链修改 子树求和,树链求和,多条树链的并集求和 撤销之前的操作 可以先用 Lengauer-Tarjan ...

随机推荐

  1. -bash: ./hello.jar: 无法执行二进制文件

    在linux中直接调用java包产生的 解决:依赖多个包要用冒号分隔,而不是分号 正确:> java -cp ./lib/*:./hello.jar hello 错误:> java -cp ...

  2. 一个使用Spring的AspectJ LTW的简单例子

    参考:Spring Framework Reference Documentation Spring AOP 实现原理与 CGLIB 应用 比较分析 Spring AOP 和 AspectJ 之间的差 ...

  3. Dapper(一) 简介和性能

    Dapper的简介 Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的.Dapper只有一个代码文件,完全开源,你 ...

  4. WPF国际化方式1之资源文件

    先看效果吧,个人觉得由于MVVM模式的UI响应属性变化的特殊机制,资源文件和内存数据都是国际化不错的选择. 1.首先准备两个资源文件用来做中文和英文的转换使用,将程序中需要转换语言都弄成两个版本,分别 ...

  5. 牛顿迭代法理论推导及python代码实现

    公式不便于在这里编辑,所以在word中编辑好了,截图过来. 用python+牛顿迭代法   求 y =(x-2)**3的解 import numpy as np import matplotlib.p ...

  6. vue2.0中router-link详解

    vue2.0中router-link详解:https://blog.csdn.net/lhjuejiang/article/details/81082090 在vue2.0中,原来的v-link指令已 ...

  7. luoguP3384 [模板]树链剖分

    luogu P3384 [模板]树链剖分 题目 #include<iostream> #include<cstdlib> #include<cstdio> #inc ...

  8. Leetcode Lect2 Java 中的 Interface

    什么是 Interface Java接口(Interface)是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以 ...

  9. Address already in use : connect

    Address already in use : connect 错误以及处理 项目中有过手写并发测试,在长时间的并发测试(超过20秒,美妙超过2000)的情况下出现了以上错误 处理方法如下(抄的) ...

  10. vue.js(09)--v-for中的key

    v-for中key的使用注意事项 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...