P r o b l e m \mathrm{Problem} Problem
有一个情报网共有 n n n个人,通过有向的电话线联络。为保证通信安全,需要满足一些要求,这些要求分为两类:
- ①从第 a a a个人通过一条或多条电话线可以联系到第 b b b个人;
- ②从第 a a a个人通过一条或多条电话线不能联系到第 b b b个人。
现在作为总工程师的你需要构造一个合法的情报网,使得这个情报网满足给定要求,或者告诉情报机构这样的情报网是不存在的。
S o l u t i o n \mathrm{Solution} Solution
这道题 a a a如果到 b b b的情况一定满足的话,一定要在满足这对条件的情况下,其它对尽量难以到达,这是一种贪心的最优策略。因此我们只要将 ① ① ①中的边连接起来,在判断 ② ② ②是否合法即可。
那么我们如何判断合法呢?显然我们只需要用tarjan缩点判断A能否到达B即可。判断方法就是用数组暴力标记,类似于二维的DP: f [ i ] [ j ] f[i][j] f[i][j]表示当前节点 i i i是否是节点 j j j所能到达的。
这样转移的复杂度是不优秀的: O ( n 2 ) O(n^2) O(n2).
由于这只是0/1状态,如果我们使用bitset中的或操作,复杂度可以优化到: O ( n