loj#P2856. 「CEOI2012」网络

「CEOI2012」网络

题目描述

译自 CEOI 2012 Day2 T3「Network

我们的工程师设计了一个通信网络,它由节点和一些节点对之间的单向直接通信信道(链路)组成。如果有一系列不同的节点 p1,p2,,pkp_1, p_2, \dots, p_k,且 p=p1,q=pkp = p_1, q = p_k,我们说节点 qq 从节点 pp 在一条路径上是可达的。这样,对于每一个 i=1,,k1i = 1, \dots, k-1,都有一个从 pip_ipi+1p_{i+1} 传输数据的链路。这个网络有一个中心节点 rr,因此 rr 可以通过一条路径到达其他任何节点 pp,对于任意一对节点 ppqq,从 pp 到达 qq 的路径最多只有一条。维护者计划对网络进行改进,但尚未决定如何改进。他们正在考虑的一个想法是重新分配中心节点,因此他们想知道对于每个节点,在一条路径上有多少节点是可达的。另一个想法是将网络去中心化,他们还想知道如何引入新的链路,从而使得对于任意一对节点 ppqq,只有一条路径可以从 pp 到达节点 qq,反之亦然。

您将编写一个程序,计算每个节点(子任务 A)的可达节点的数量,并计算使每个节点以独特的方式从每个其他节点可达所需的最小新链路数量。你的程序也需要给出新链接的列表(子任务 B)。

输入格式

输入的第一行包含三个整数:节点数 NN,链路数 MM,中心节点 rr。节点的编号从 11NN

接下来 MM 行是链路的描述。每行包含两个整数 ppqq 对应一条可以将数据从 pp 传输到 qq 的链路。

输出格式

输出的第一行包含子任务 A 的解:NN 个以空格分隔的整数,其中第 ii 个数字是节点 ii 的可达节点数(包括 ii 本身)。

剩下的行包含子任务 B 的解:输出的第二行包含一个整数 KK,这是实现上述网络属性所需的最小新链路数。接下来的 KK 行列出了新的链路:每一行包含两个整数 uuvv,用空格隔开,它们对应一个从节点 uu 传输数据到节点 vv 的新链路。

如果有多组解,输出任意一组即可。

11 12 3
3 2
2 1
2 4
4 5
4 6
6 2
6 7
3 8
8 9
9 10
9 11
10 8
1 6 11 6 1 6 1 4 4 4 1
5
1 3
5 4
7 6
11 9
8 3

数据范围与提示

对于 50%50\% 的数据,1N100001 \leq N \leq 10000
对于 100%100\% 的数据,1N1000001 \leq N \leq 1000001M5000001 \leq M \leq 5000001rN1 \leq r \leq N

子任务 A 占据了每个测试点 40%40\% 的分数,子任务 B 占据了其余 60%60\% 的分数。

如果你只想回答子任务 A,请在第二行输出 00 后结束程序;
如果你只想回答子任务 B,也需要在第一行输出 NN 个任意整数。