Tarjan缩点
Link
ps: 建议大家交完Luogu然后去BZOJ看一眼, 会发现一些神奇的东西🐸️
Description
一位冷血的杀手潜入Na-wiat,并假装成平民。警察希望能在N个人里面,查出谁是杀手。警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人,谁是杀手,谁是平民。假如查证的对象是杀手,杀手将会把警察干掉。现在警察掌握了每一个人认识谁。每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。
问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?
Samples
Input #1
1 | 5 4 |
Output #1
1 | 0.800000 |
Solution
考虑把认识关系连成一条有向的边, 那么所有的关系将会构成一张有向图.
容易发现, 在一个强连通分量里面的节点, 只要查其中一个点, 那么就可以获得其他所有点的信息.
那么我们就可以先来一遍Tarjan
缩点.
如果我们发现,调查完除了某个人之外的所有人之后都没有发现目标, 那么此人一定是目标.
这种情况下就不需要再调查了, 那么考虑特判掉这种不在任何一个强连通分量里的节点, 设这种节点有$x$个, 那么答案一定是:
$$1 - \frac {1 - x - [x != 0]}{n}$$
Code
具体细节可以康康代码, 里面有较详细的注释.
ps: 码风又改回来了.
1 | /* Headers */ |