#qLTFLybttg030502. 1514:【例 2】最大半连通子图
1514:【例 2】最大半连通子图
1514:【例 2】最大半连通子图
题目描述
一个有向图 称为半连通的 (Semi-Connected),如果满足:,满足 或 ,即对于图中任意两点 ,存在一条 到 的有向路径或者从 到 的有向路径。
若 满足, 是 中所有和 有关的边,则称 是 的一个导出子图。若 是 的导出子图,且 半连通,则称 为 的半连通子图。若 是 所有半连通子图中包含节点数最多的,则称 是 的最大半连通子图。
给定一个有向图 ,请求出 的最大半连通子图拥有的节点数 ,以及不同的最大半连通子图的数目 。由于 可能比较大,仅要求输出 对 的余数。
输入格式
第一行包含三个整数 。 分别表示图 的点数与边数, 的意义如上文所述;
接下来 行,每行两个正整数 ,表示一条有向边 。
图中的每个点将编号为 ,保证输入中同一个 不会出现两次。
输出格式
输出两行。第一行包含一个整数 ,第二行包含整数 。
样例
样例输入 #1
6 6 20070603
1 2
2 1
1 3
2 4
5 6
6 4
样例输出 #1
3
3
样例解释 #1
- 个点, 条有向边,。
- 边:
- 图 的强连通分量:
- 分量 :(因为 )
- 分量 :
- 分量 :
- 分量 :(?只有 ,没有 ,所以不是强连通,但 且 不能到 ,所以 和 各自为单独的强连通分量?需要运行 Tarjan)。
- 实际上, 和 之间只有 ,不能互相到达,所以它们是不同的强连通分量。
- 缩点后得到 DAG,求最大半连通子图(即最长链的节点数及其方案数)。
- 样例中最大半连通子图节点数 ,可能的一种是 或 等,但注意必须满足半连通性(任意两点可达或反向可达)。 中 不能到 或 ,但 能到 ,所以是半连通的。类似 也满足。 中 不能到 ( 是可达的),且 不能到 ,所以不满足半连通。
- 最大节点数为 ,方案数 (可能是 、、?但后两者与第一个可能是同一导出子图?注意集合相同但顺序不同不算不同子图)。实际上 需要根据算法得出。
数据范围
- 对于 的数据,;
- 对于 的数据,;
- 对于 的数据,,,。
时空限制
- 时间限制:1000 ms
- 内存限制:65536 KB
注意:本题需要先进行强连通分量缩点(因为一个强连通分量内的点相互可达,可以视为一个整体),然后在得到的 DAG 上求最大节点数的半连通子图(即最长链,因为 DAG 中半连通子图对应一条链)。需要注意去重边(因为缩点后可能有重边,会影响方案计数)。可以使用拓扑排序动态规划求解: 表示以 为终点的最大节点数, 表示对应的方案数。转移时要注意从不同的前驱转移,且去重边。由于 较大,需要用邻接表存储,并注意常数优化。