Day10 - C - Blow up the city HDU - 6604
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的更多相关文章
- Blow up the city
Blow up the city 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Country A and B are at war. Country A needs to organ ...
- 【HDOJ6604】Blow up the city(支配树)
题意:给定一个n点m边的DAG,将只有入边的点称为周驿东点 q次询问,每次给定a,b两点,询问删去某个点x和其相连的所有边,能使a,b至少其中之一不能到达任何周驿东点的x的个数 n,q<=1e5 ...
- 2019 Multi-University Training Contest 3
B.Blow up the city solved by F0_0H 210min 题意 给一个DAG,每次询问给定u,v,求使得u或v不能与中心点联通的关键点个数 做法 按照拓扑序建树 新加节点的父 ...
- ZJUT11 多校赛补题记录
牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...
- HDU 1505 City Game (hdu1506 dp二维加强版)
F - City Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- HDU 3634 City Planning (离散化)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 3624 City Planning(暴力,也可扫描线)
City Planning Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 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 ...
- Hdu 5352 MZL's City (多重匹配)
题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...
随机推荐
- 夯实Java基础(二十五)——JDBC使用详解
1.JDBC介绍 JDBC的全称是Java Data Base Connectivity(Java数据库连接).是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问(例如MyS ...
- 洗牌利器——random.shuffle()函数
random.shuffle()是一个非常实用但是又非常容易被忽略的函数,shuffle在英语里是"洗牌"的意思,该函数非常形象地模拟了洗牌的过程,即: random.shuffl ...
- pytoch 安装
注意替换清华源,否则直接安装速度会很慢. conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud ...
- svnserve: Can’t bind server socket: Address already in use报错解决办法
最近在学习自己搭建SVN服务,意外的报错 svnserve: Can’t bind server socket: Address already in use 于是google了下,原来是 已经启动了 ...
- java 操作 csv文件
CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...
- python笔记14
今日内容 带参数的装饰器: flask框架 + django缓存 + 写装饰器实现被装饰的函数要执行N次 模块 os sys time(三种类型) datetime 和 timezone[了解] 内容 ...
- ava StringTokenizer 类使用方法
菜鸟教程 -- 学的不仅是技术,更是梦想! 首页 笔记首页 Android 互联网 程序员人生 程序员笑话 编程技术 红包 知识店铺 --> 首页 Android 鸡汤 逗乐 Search Ja ...
- centos上正式环境邮件发送失败问题
用celery异步发送邮件的时候遇到一个问题: 能接收到任务,但是就是执行不了, 也不报错 发现可能是settIngs.py里设置的端口有问题, 现在设置的端口是25, 改成465, 并且把ssl打开 ...
- JS原型链的理解和使用(二)
根据在创建对象的时候,创建出来的对象的__proto__指向创建这个对象的函数的prototype属性. 由于在调用对象的属性或者方法的时候会首先在对象的作用域中查找指定的属性或者方法,如果未找到则会 ...
- 【转载】Oracle sqlplus中最简单的一些命令,设置显示的格式
登录数据库: 方式(1)当我们刚安装Oracle数据库时,登录账户时可以使用win+r 输入sqlplus,进入sqlplus命令窗口,然后输入用户名和密码,这里输入密码时不会有回显 方式(2)使用w ...