题意:给定一个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. Python——GUI可视化

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class ...

  2. 快速测试端口的连通性(HTTP/HTTPS)

    ping 仅限 80 端口,命令中无法指定端口: C:\Users\Administrator>ping kikakika.com 遗失对主机的连接. 正在 Ping kikakika.com ...

  3. Go-内存To Be

    做一个快乐的互联网搬运工- 逃逸分析 逃逸分析的概念 在编译程序优化理论中,逃逸分析是一种确定指针动态范围的方法——分析在程序的哪些地方可以访问到指针. 它涉及到指针分析和形状分析. 当一个变量(或对 ...

  4. 【Jmeter】利用Jmeter+ant+Jenkins 搭建 接口&性能测试 持续集成平台

    https://www.jianshu.com/p/6ab73a95d53e https://yq.aliyun.com/articles/664329

  5. git常用命令总结 git常用命令总结

    git常用命令总结:https://www.cnblogs.com/jackchensir/p/8306448.html 利用git提交代码 一.首先需要下载git 查看电脑是否安装git,打开终端, ...

  6. redis 不可重入分布式锁(setNx()和getset()方法实现)

    通常如果在单机环境,使用synchronized或juc ReentrantLock 实现锁机制,但如果是分布式系统,则需要借助第三方工具实现,比如redis.zookeeper等.redis为单进程 ...

  7. hdu3664 Permutation Counting(dp)

    hdu3664 Permutation Counting 题目传送门 题意: 在一个序列中,如果有k个数满足a[i]>i:那么这个序列的E值为k,问你 在n的全排列中,有多少个排列是恰好是E值为 ...

  8. project euler-34

    145是个奇怪的数字.由于1!+ 4! + 5! = 1 + 24 + 120 = 145. 请求出能表示成其每位数的阶乘的和的全部数的和. 请注意:由于1! = 1和2! = 2不是和,故它们并不包 ...

  9. jquery实现按键增加删除css属性(hide)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. crack Tut.ReverseMe1.exe

    测试文件:https://www.wocloud.com.cn/webclient/share/sindex.action?id=i9K_Br6TgE7ZLB3oBGUcJmKcRy5TUdZ8U6_ ...