#qLTFLybttg030502. 1514:【例 2】最大半连通子图

1514:【例 2】最大半连通子图

1514:【例 2】最大半连通子图

题目描述

一个有向图 G=(V,E)G=(V,E) 称为半连通的 (Semi-Connected),如果满足:u,vV\forall u,v \in V,满足 uvu \to vvuv \to u,即对于图中任意两点 u,vu,v,存在一条 uuvv 的有向路径或者从 vvuu 的有向路径。

G=(V,E)G'=(V',E') 满足,EE'EE 中所有和 VV' 有关的边,则称 GG'GG 的一个导出子图。若 GG'GG 的导出子图,且 GG' 半连通,则称 GG'GG 的半连通子图。若 GG'GG 所有半连通子图中包含节点数最多的,则称 GG'GG 的最大半连通子图。

给定一个有向图 GG,请求出 GG 的最大半连通子图拥有的节点数 KK,以及不同的最大半连通子图的数目 CC。由于 CC 可能比较大,仅要求输出 CCXX 的余数。

输入格式

第一行包含三个整数 N,M,XN, M, XN,MN, M 分别表示图 GG 的点数与边数,XX 的意义如上文所述;

接下来 MM 行,每行两个正整数 a,ba, b,表示一条有向边 (a,b)(a,b)

图中的每个点将编号为 1,2,3,,N1,2,3,\cdots,N保证输入中同一个 (a,b)(a,b) 不会出现两次

输出格式

输出两行。第一行包含一个整数 KK,第二行包含整数 CmodXC \bmod X

样例

样例输入 #1

6 6 20070603
1 2
2 1
1 3
2 4
5 6
6 4

样例输出 #1

3
3

样例解释 #1

  • N=6N=6 个点,M=6M=6 条有向边,X=20070603X=20070603
  • 边:
    1. 121 \to 2
    2. 212 \to 1
    3. 131 \to 3
    4. 242 \to 4
    5. 565 \to 6
    6. 646 \to 4
  • GG 的强连通分量:
    • 分量 AA{1,2}\{1,2\}(因为 121 \leftrightarrow 2
    • 分量 BB{3}\{3\}
    • 分量 CC{4}\{4\}
    • 分量 DD{5,6}\{5,6\}565 \leftrightarrow 6?只有 565 \to 6,没有 656 \to 5,所以不是强连通,但 646 \to 444 不能到 66,所以 5566 各自为单独的强连通分量?需要运行 Tarjan)。
    • 实际上,5566 之间只有 565 \to 6,不能互相到达,所以它们是不同的强连通分量。
  • 缩点后得到 DAG,求最大半连通子图(即最长链的节点数及其方案数)。
  • 样例中最大半连通子图节点数 K=3K=3,可能的一种是 {1,2,3}\{1,2,3\}{1,2,4}\{1,2,4\} 等,但注意必须满足半连通性(任意两点可达或反向可达)。{1,2,3}\{1,2,3\}33 不能到 1122,但 11 能到 33,所以是半连通的。类似 {1,2,4}\{1,2,4\} 也满足。{5,6,4}\{5,6,4\}55 不能到 445645\to6\to4 是可达的),且 44 不能到 55,所以不满足半连通。
  • 最大节点数为 33,方案数 C=3C=3(可能是 {1,2,3}\{1,2,3\}{1,2,4}\{1,2,4\}{2,1,3}\{2,1,3\}?但后两者与第一个可能是同一导出子图?注意集合相同但顺序不同不算不同子图)。实际上 C=3C=3 需要根据算法得出。

数据范围

  • 对于 20%20\% 的数据,N18N \le 18
  • 对于 60%60\% 的数据,N104N \le 10^4
  • 对于 100%100\% 的数据,1N1051 \le N \le 10^51M1061 \le M \le 10^6X108X \le 10^8

时空限制

  • 时间限制:1000 ms
  • 内存限制:65536 KB

注意:本题需要先进行强连通分量缩点(因为一个强连通分量内的点相互可达,可以视为一个整体),然后在得到的 DAG 上求最大节点数的半连通子图(即最长链,因为 DAG 中半连通子图对应一条链)。需要注意去重边(因为缩点后可能有重边,会影响方案计数)。可以使用拓扑排序动态规划求解:dp[u]dp[u] 表示以 uu 为终点的最大节点数,ways[u]ways[u] 表示对应的方案数。转移时要注意从不同的前驱转移,且去重边。由于 MM 较大,需要用邻接表存储,并注意常数优化。