CF190E Counter Attack

题目描述

伯兰成功击退了平原人的进攻,现在开始发起反击。 平原国有 $n$ 个城市,编号从 $1$ 到 $n$,其中一些城市之间通过双向道路相连。平原国的地图上,只有在两个城市之间实际上没有道路时,才会表示有道路(我们不清楚这是巧妙的防间谍策略还是为了省墨)。换句话说,如果在平原国的地图上两个城市之间用道路相连,则实际上这两个城市之间没有道路;反之,如果在地图上没有道路,则实际上两个城市之间有道路。 伯兰人获得了一张平原国的地图。现在,士官 Vasya 接到将军 Touristov 的命令,要求找出所有这样的城市分组——在每一个分组中,任意两个城市之间都可以通过实际存在的道路互相到达,并且不同组的城市之间无法通过实际道路互达。的确,一个一个消灭这些分组要比包围整个平原国容易! 请你帮助士官完成这个任务,助他晋升为中士!不要忘记,平原国的地图上连接的城市对实际上是没有道路的,反之亦然。

输入格式

第一行包含两个用空格分隔的整数 $n$ 和 $m$ $(1\le n \le 5 \cdot 10^{5},\ 0\le m\le10^{6})$ —— 平原国中的城市数和地图上标记的道路数。 接下来的 $m$ 行每行描述地图上的一条“道路”。第 $i$ 行包含两个整数 $a_i$ 和 $b_i$ $(1\le a_i, b_i \le n,\ a_i\ne b_i)$ —— 表示在地图上城市 $a_i$ 与 $b_i$ 之间有一条连接。 保证每对城市最多只出现在输入中一次。

输出格式

第一行输出一个整数 $k$,表示通过实际存在的道路,城市被划分为 $k$ 个组。每个组内城市彼此可达,不同组之间城市不可达。 接下来的 $k$ 行,每行先输出一个整数 $t_i$ $(1\le t_i \le n)$,表示第 $i$ 个组内的城市数量,然后输出该组内所有城市的编号(用空格隔开)。 分组的顺序及组内编号的顺序均不限。所有 $k$ 个组的 $t_i$ 之和等于 $n$。

说明/提示

在第一个样例中,实际上仅有城市 $1-4$ 和城市 $2-3$ 之间有道路。 在第二个样例中,城市 $1$ 和 $2$ 之间没有城市直接连接,但你可以通过城市 $3$ 从一个到另一个。 由 ChatGPT 5 翻译