题目
一位冷血的杀手潜入 Na-wiat,并假装成平民。警察希望能在 N 个人里面,查出谁是杀手。
警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人,谁是杀手,谁是平民。假如查证的对象是杀手,杀手将会把警察干掉。
现在警察掌握了每一个人认识谁。
每一个人都有可能是杀手,可看作他们是杀手的概率是相同的。
问:根据最优的情况,保证警察自身安全并知道谁是杀手的概率最大是多少?
INPUT
第一行有两个整数 N,M。
接下来有 M 行,每行两个整数 x,y,表示 x 认识 y(y 不一定认识 x,例如胡锦涛同志)。
OUTPUT
仅包含一行一个实数,保留小数点后面 6 位,表示最大概率。
SAMPLE
INPUT
5 4
1 2
1 3
1 4
1 5
OUTPUT
0.800000
解题报告
考试时没想出来,随便打的输出样例- -
正解:
警察只有两种结果——查到犯人或者死,而死一定是包含在“调查未知身份的人”,也就是说调查未知身份的人越多,死亡概率越高,所以我们要求警察如何尽可能少调查未知身份的人
那么问题就很简单了,我们发现对于一个强连通分量,我们可以把他们看作一个人,因为调查了其中一个,剩余的都可以安全到达(正确性显然,因为你只要安全调查了其中的一个人,你就可以通过每次确认安全的人从而调查整个强连通分量),那么我们就可以tarjan一下,那么我们调查的对象就为缩点后入度为0的点(因为你无法从其他点通向这个点,你只能通过调查其中一个未知身份的人来调查整个强连通分量,如果警察RP不好,第一个选中杀手,警察就GG了),所以调查的未知身份的人数就是这些点的数量。
坑点:
存在这样一种情况,至少有一个点,且只有一个人,而且没人认识他,他也不认识别人,或者他认识的每个人都能被除他以外的其他人所认识(即入度>1),那么我们调查完其他人后,他就是杀手(正确性显然,对于第一种情况,考虑n=1就行,对于第二种情况,他认识的人已经被调查过了,而其他人自然也被调查过,那么他自己就是剩下未调查的唯一可能的杀手)。
那么如何处理呢?
进行特判,顺便dfs一下,判断是否属于这种情况就可以啦
哀民生之多艰啊- -