有向图的连通性(Tarjan) 测试二 题目记录

· · 个人记录

zsq 真是为学生的身心健康着想,“杀人游戏”被和谐成“抓小偷”。

第四题 zsq 的神奇数据还会出现自己给自己戴绿帽的情况。

T1:水。答案是每个强连通分量的最小点权之和。

T2:水。经典的 \rm Floyd + bitset 优化,复杂度 O(\frac {n^3}{32})

不过我还有一种更优秀的写法,只需缩点后维护每两个强连通分量的连通情况,不过由于缩完点后可以跑拓排,所以再加上个 \rm bitset 复杂度是 O(\frac {n^{*}m^{*}}{32}) 的。

n^*,m^* 是缩点后的点数和边数,所以在一般数据下表现比较优秀,即使卡满了还是有常数上的优势)

T3:水。找到缩点后入度为 0 的分量,答案是每个这样的分量的最小点权之和,注意若存在无法被贿赂的情况无解。

T4:图论建模题,那么第一个问题就是如何建边。

仔细看看题目描述,“离婚”操作是这样的:第一对 cp 直接被拆散,那么男一就去寻找曾经的女友女二,然后男二老婆被抢了又去找女三,接着男三找女四......以此类推。

(注意女一不会主动找其它男的)

那么对于原先的婚姻关系,我们应当由女向男连一条边;对于“旧情”则是由男向女连一条边。这样做,“离婚”操作就能抽象地看作由男一出发的一条路径了。

(其实试试也能知道怎么连)

然后回到“离婚操作”,如果拆散男一女一后,仍可以让所有人找到伴侣,那么显然女一也会被某个男的找到再续前缘。

于是“不安全婚姻”应当是这样的:男一找女二,男二找女三,男三找女四......男 x 找女一。

回到图论模型中,显然构成一个环,于是自然而然想到强连通分量了。

最后考虑如何判定是否安全,只需男的和女的在同一个强连通分量中即可。

T5:首先考虑 DAG 上的情况,显然只需检查入度为 0 的人即可,若其中存在杀手则结束,否则一层一层检查下去一定能找到杀手,并且可以保证警察同志的安全~

注意可以使用排除法,即检查 n-1 个人就一定能得知 n 个人的全部身份。

那么,只需逐个检查每个入度为 0 的点,若它的所有可达节点都能被其它入度为 0 的点到达,则说明不检查这个人也行。

(注意这样的人至多存在一位,不可重复计数)

具体的,考虑拓扑排序求出每个点能被多少个入度为 0 的点到达,然后按上述步骤判定即可。

不过检查所有可达节点显然会超时,仔细想想,没必要检查所有可达节点,只需检查直接相连的点即可。

对于一般图,只需缩点转换为 DAG 处理即可。

还有一个细节:排除法只能对一个人使用,所以点数 >1 的强连通分量一定无法使用排除法。

最后是计算概率,设 cnt 为最少检查的人数,则概率为 \frac {n-cnt}{n}

(吐槽一下连计算概率都能写错的 sb 作者)