Country A and B are at war. Country A needs to organize transport teams to deliver supplies toward some command center cities.

In order to ensure the delivery works efficiently, all the roads in country A work only one direction. Therefore, map of country A can be regarded as DAG( Directed Acyclic Graph ). Command center cities only received supplies and not send out supplies.

Intelligence agency of country B is credibly informed that there will be two cities carrying out a critical transporting task in country A.

As long as **any** one of the two cities can not reach a command center city, the mission fails and country B will hold an enormous advantage. Therefore, country B plans to destroy one of the nn cities in country A and all the roads directly connected. (If a city carrying out the task is also a command center city, it is possible to destroy the city to make the mission fail)

Now country B has made qq hypotheses about the two cities carrying out the critical task.
Calculate the number of plan that makes the mission of country A fail.

InputThe first line contains a integer TT (1≤T≤10)(1≤T≤10), denoting the number of test cases.

In each test case, the first line are two integers n,mn,m, denoting the number of cities and roads(1≤n≤100,000,1≤m≤200,000)(1≤n≤100,000,1≤m≤200,000).
Then mm lines follow, each with two integers uu and vv, which means there is a directed road from city uu to vv (1≤u,v≤n,u≠v)(1≤u,v≤n,u≠v).

The next line is a integer q, denoting the number of queries (1≤q≤100,000)(1≤q≤100,000)
And then qq lines follow, each with two integers aa and bb, which means the two cities carrying out the critical task are aa and bb (1≤a,b≤n,a≠b)(1≤a,b≤n,a≠b).

A city is a command center if and only if there is no road from it (its out degree is zero).OutputFor each query output a line with one integer, means the number of plan that makes the mission of country A fail.Sample Input

2
8 8
1 2
3 4
3 5
4 6
4 7
5 7
6 8
7 8
2
1 3
6 7
3 2
3 1
3 2
2
1 2
3 1

Sample Output

4
3
2
2

国家A和B处于战争状态。A国需要组织运输队向一些指挥中心城市提供物资。为了确保交付有效,A国的所有道路只能向一个方向发展。因此,国家A的地图可以被视为DAG。指挥中心城市只收到物资而不发送物资。B国的情报机构可靠地获悉,将有两个城市在A国执行关键的运输任务。只要两个城市中的任何一个都无法到达指挥中心城市,任务就会失败,B国将拥有巨大的优势。因此,B国计划摧毁A国的n个城市之一和所有直接连接的道路。(如果执行任务的城市也是指挥中心城市,则可以摧毁城市以使任务失败)现在,B国对这两个执行关键任务的城市提出了q假设。计算使国家A的任务失败的计划数量。

思路:支配树,相当于求2点的lca到出度为0的点的数量,拓扑反向建树,DAG->拓扑排序->从出度为0的点开始反向建树->通过lca,因为该题可能有多个连通块,就把每个出度为0的点连接到一个多源上,方便统计

const int maxm = 1e5+;

int head[maxm<<], edgecnt, depth[maxm], grand[maxm][], n, limit, in[maxm], que[maxm];

struct edge{
int u, v, nex;
} edges[maxm<<]; void addedge(int u, int v) {
edges[++edgecnt].u = u;
edges[edgecnt].v = v;
edges[edgecnt].nex = head[u];
head[u] = edgecnt;
} void init() {
edgecnt = ;
memset(head, , sizeof(head));
memset(in, , sizeof(in));
memset(grand, , sizeof(grand));
memset(depth, , sizeof(depth));
} void toposort() {
int l = , r = ;
for(int i = ; i <= n; ++i)
if(!in[i]) que[r++] = i;
while(l < r) {
int u = que[l++];
for(int i = head[u]; i; i = edges[i].nex) {
if(!--in[edges[i].v])
que[r++] = edges[i].v;
}
}
} int lca(int a, int b) {
if(a == b) return a;
if(depth[a] > depth[b]) swap(a, b);
for(int i = limit; i >= ; --i)
if(depth[a] <= depth[b] - (<<i)) b = grand[b][i];
if(a == b) return a;
for(int i = limit; i >= ; --i)
if(grand[a][i] == grand[b][i]) continue;
else {
a = grand[a][i], b = grand[b][i];
}
return grand[a][];
} void run_case() {
init();
int m, u, v, q;
cin >> n >> m;
for(int i = ; i < m; ++i) {
cin >> u >> v;
addedge(u, v);
in[v]++;
}
limit = floor(log(n+0.0)/log(2.0))+;
toposort();
for(int i = n; i > ; --i) {
int u = que[i];
if(!head[u]) {
addedge(, u);
depth[u] = ;
continue;
}
int v = edges[head[u]].v;
for(int j = edges[head[u]].nex; j; j = edges[j].nex) v = lca(v, edges[j].v);
depth[u] = depth[v] + ;
grand[u][] = v;
for(int j = ; j <= limit; ++j) grand[u][j] = grand[grand[u][j-]][j-];
}
cin >> q;
while(q--) {
cin >> u >> v;
cout << depth[u] + depth[v] - depth[lca(u, v)] << "\n";
} } int main() {
ios::sync_with_stdio(false), cin.tie();
int t;
cin >> t;
while(t--)
run_case();
return ;
}

Day10 - C - Blow up the city HDU - 6604的更多相关文章

  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. 【HDOJ6604】Blow up the city(支配树)

    题意:给定一个n点m边的DAG,将只有入边的点称为周驿东点 q次询问,每次给定a,b两点,询问删去某个点x和其相连的所有边,能使a,b至少其中之一不能到达任何周驿东点的x的个数 n,q<=1e5 ...

  3. 2019 Multi-University Training Contest 3

    B.Blow up the city solved by F0_0H 210min 题意 给一个DAG,每次询问给定u,v,求使得u或v不能与中心点联通的关键点个数 做法 按照拓扑序建树 新加节点的父 ...

  4. ZJUT11 多校赛补题记录

    牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...

  5. HDU 1505 City Game (hdu1506 dp二维加强版)

    F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  6. HDU 3634 City Planning (离散化)

    City Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. hdu 3624 City Planning(暴力,也可扫描线)

    City Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. HDU 3080 The plan of city rebuild(prim和kruskal)

    The plan of city rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  9. Hdu 5352 MZL's City (多重匹配)

    题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...

随机推荐

  1. ubuntu 18 python3.6更换国内源和pip3源

    1.更换国内源 查看Ubuntu18版本和codename(一定要注意codename对应) lsb_release -a No LSB modules are available. Distribu ...

  2. PTA的Python练习题(十三)

    第4章-8 求分数序列前N项和 a=eval(input()) b=2 c=1 d=0 count=0 for i in range(a): count+=b/c d=b b=b+c c=d prin ...

  3. python3下pygame显示中文的设置

    1.先看代码: import pygame from pygame.locals import * def main(): pygame.init() screen = pygame.display. ...

  4. 吴裕雄--天生自然TensorFlow2教程:手写数字问题实战

    import tensorflow as tf from tensorflow import keras from keras import Sequential,datasets, layers, ...

  5. NFS网络文件共享系统!

    NFS是运行在应用层上的协议,其默认的端口为2049,它适用于linux与linux之间,也适用于linux与unix之间,亦可适用于linux与windows之间 nfs优缺点优点 节省本地硬盘的存 ...

  6. Sqlserver 日志文件收缩命令

    SELECT NAME,recovery_model_desc FROM sys.databases -- 如果是FULL类型,修改为SIMPLE类型 ALTER DATABASE DBName SE ...

  7. java finalize学习

    1 finalize()调用的时机 与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC的自动回收机制,因而并不能保证finalize方法会被及时地执行(垃圾对象的回收时机 ...

  8. 「JSOI2014」序列维护

    「JSOI2014」序列维护 传送门 其实这题就是luogu的模板线段树2,之所以要发题解就是因为学到了一种比较NB的 \(\text{update}\) 的方式.(参见这题) 我们可以把修改操作统一 ...

  9. 前端学习 之 HTML

    一.HTML 介绍 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言,它不是一种编程语言. HTML使用标签来描述网页.不像p ...

  10. 设计模式课程 设计模式精讲 3-10 里氏替换原则coding

    1 代码演练 1.1 继承关系判别(是否是真正意义的继承) 1.2 入参控制 1.3 出参控制 1 代码演练 1.1 继承关系判别(是否是真正意义的继承)(其实我觉得这个例子有点牵强) 1.1.1 反 ...