#P15194. [SWERC 2019] Bird Watching

[SWERC 2019] Bird Watching

说明

Kiara 正在研究一种行为方式非常奇特的鸟类。它们的移动最好用图的语言来解释:存在一个有向图 GG,其节点是树木,只有当 (Ta,Tb)(T_a, T_b)GG 的一条边时,鸟才能从一棵树 TaT_a 飞到另一棵树 TbT_b

Kiara 并不知道控制这些鸟类飞行的真实图 GG,但在她之前的实地研究中,Kiara 收集了许多鸟类旅程的数据。利用这些数据,她构建了一个图 PP 来解释它们是如何移动的。Kiara 花了大量时间观察它们,因此她确信,如果一只鸟可以直接从 aa 飞到 bb,那么她至少目击过一次这样的飞行。然而,有可能一只鸟的飞行路径是 aabb 再到 cc,但她只目击了停靠点 aacc,于是将 (a,c)(a, c) 添加到了 PP 中。也可能是一只鸟的飞行路径是 aabbcc 再到 dd,而她只目击了 aadd,于是将 (a,d)(a, d) 添加到了 PP 中,等等。总而言之,她知道 PP 包含了 GG 的所有边,并且 PP 可能还包含一些其他的边 (a,b)(a, b),这些边在 GG 中存在一条从 aabb 的路径(注意,PP 可能并不包含所有这样的边)。

对于下一次实地研究,Kiara 决定将基地安置在一棵给定的树 TT 旁边。为了预警鸟类到达 TT,她还希望在鸟类可能飞来的树木(即满足 (T,T)(T', T)GG 中一条边的那些树 TT')上安装探测器。由于探测器价格不菲,她只希望在那些她确信 (T,T)(T', T) 属于 GG 的树 TT' 上安装探测器。

Kiara 确信一条边 (a,b)(a, b) 属于 GG,当且仅当 (a,b)(a, b)PP 的一条边,并且所有在 PP 中从 aa 开始、在 bb 结束的路径都使用了边 (a,b)(a, b)。Kiara 请你计算集合 S(T)S(T),即所有她确信 (T,T)(T', T)GG 的一条边的树 TT'

输入格式

输入描述图 PP。第一行包含三个空格分隔的整数 NN, MM, 和 TTNNPP 的节点数,MMPP 的边数,TT 是 Kiara 将要安置基地的树所对应的节点。

接下来的 MM 行描述图 PP 的边。每行包含两个空格分隔的整数 aabb0a,b<N0 \leq a, b < Naba \neq b),表示 (a,b)P(a, b) \in P。保证同一对 (a,b)(a, b) 不会出现两次。

输出格式

你的输出应描述集合 S(T)S(T)。第一行应包含一个整数 LL,即 S(T)S(T) 中的节点数,接下来是 LL 行,每行包含 S(T)S(T) 的一个不同元素。S(T)S(T) 的元素应按升序打印,每行一个元素。

3 3 2
0 1
0 2
1 2
1
1
6 8 2
0 1
0 2
1 2
2 0
2 3
3 4
4 2
2 5
2
1
4

提示

样例解释 1

此示例对应的图如右图所示。节点 11 属于 S(2)S(2),因为(唯一)从 1122 的路径使用了 (1,2)(1, 2)。节点 00 不属于 S(2)S(2),因为路径 0120 \to 1 \to 2 没有使用边 (0,2)(0, 2)

:::align{center} :::

样例解释 2

此示例对应的图如右图所示。出于与样例 1 相同的原因,节点 00 不属于 S(2)S(2),而 11 属于。节点 3355 不属于 S(2)S(2),因为我们没有边 (3,2)(3, 2)(5,2)(5, 2)。最后,44 属于 S(2)S(2),因为所有从 4422 的路径都使用了边 (4,2)(4, 2)

:::align{center} :::

数据范围

  • 1N,M1000001 \leq N, M \leq 100\,000
  • 0T<N0 \leq T < N

翻译由 DeepSeek 完成