#L4281. 「KTSC 2021 R1」通信网络

「KTSC 2021 R1」通信网络


注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "communication.h"

题目描述

题目译自 2021년도 국제정보올림피아드 대표학생 선발고사 - 1차 선발고사 T2 「통신망」

通信网络由 NN 台计算机和 MM 条线路组成。计算机编号从 11NN。每条线路可以让两台不同的计算机进行双向通信。如果任意两台计算机可以通过一条或多条线路进行通信,则称通信网络是连通的。如果存在无法通信的计算机对,则称通信网络是断开的。

一条线路 cc 的风险度定义如下:

  • 对于通信网络中的每台计算机 ii,如果移除计算机 ii 后剩余的网络是断开的,则称计算机 ii 是危险的。
  • 初始通信网络中移除线路 cc 后,危险计算机的数量即为线路 cc 的风险度。

请编写一个程序,计算每条线路的风险度。

实现细节

你需要实现以下函数:

vector<int> find_num_critical(int N, vector<pair<int, int>> E);

  • 该函数只会被调用一次。
  • 参数 NN 表示计算机的数量。
  • 参数 EE 是一个大小为 MM 的数组,数组中的每个元素表示一条线路,由一对不同的计算机编号组成。
  • 该函数返回一个长度为 MM 的整数数组,表示每条线路的风险度。数组中每个风险度对应的线路顺序与输入的 EE 相同。

注意,提交的代码中不应包含任何输入输出操作。

样例

考虑 N=5N=5 和线路 E=[[1,5],[5,2],[2,3],[2,4],[2,5]]E=[[1,5],[5,2],[2,3],[2,4],[2,5]] 的情况。评测程序将调用如下函数:

find_num_critical(5, [[1,5],[5,2],[2,3],[2,4],[2,5]]);

初始通信网络如下图所示:

例如,移除连接 11 号和 55 号计算机的线路后,通信网络如下图所示:

在这个网络中,22334455 号计算机是危险的。注意,11 号计算机移除后剩余网络仍然连通,因此不是危险的。

移除连接 22 号和 55 号计算机的其中一条线路后,通信网络如下图所示:

在这个网络中,22 号和 55 号计算机是危险的。

find_num_critical 函数应返回数组 [4,2,4,4,2][4,2,4,4,2]

这个样例满足所有子任务的条件。

数据范围与提示

对于所有输入数据,满足:

  • 2N2.51052 \leq N \leq 2.5\cdot 10^5
  • 1M1061 \leq M \leq 10^6
  • 每条线路连接两台不同的计算机
  • 可能存在多条线路连接同一对计算机
  • 初始通信网络是连通的

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
1 5 N200N \leq 200M500M \leq 500
2 11 N1000N \leq 1000M2500M \leq 2500
3 7 N=MN=M
4 13 对于 k2k \geq 2 台不同的计算机 v1,v2,,vkv_{1}, v_{2}, \cdots, v_{k}kk 条不同的线路 c1,c2,,ckc_{1}, c_{2}, \cdots, c_{k},如果线路 cic_{i} 连接计算机 viv_{i}vi+1v_{i+1} (1ik1)(1 \leq i \leq k-1),线路 ckc_{k} 连接计算机 vkv_{k}v1v_{1},则 kk 条线路 c1,c2,,ckc_{1}, c_{2}, \cdots, c_{k} 形成一个环。两个环相同意味着组成环的线路集合相同;
对于通信网络中的每条线路 cc,包含线路 cc 的环最多存在一个
5 25 N8000N \leq 8000M2.5105M \leq 2.5\cdot 10^5
6 29 N105N \leq 10^5M2.5105M \leq 2.5\cdot 10^5
7 10 无附加限制

示例评测程序

示例评测程序的输入格式如下:

  • 11 行:NN MM
  • 1+i1+i (1iM)(1 \leq i \leq M) 行:aia_{i} bib_{i},表示 aia_{i} 号和 bib_{i} 号计算机通过线路连接

示例评测程序的输出格式如下:

  • 11 行:find_num_critical 函数返回的数组

示例评测程序可能与实际评测程序不同。