名人问题

来源:互联网 发布:互相点击软件 编辑:程序博客网 时间:2024/04/27 16:43

名人的定义:他不认识任何人,任何人都认识他 (最多有一个名人)

和众数问题的框架很像,都是维护一个candidate,然后扫一遍,不断排除,最后的唯一的可能性就是candidate,验证这个candidate


1)取第一个做为candidate

2) 遍历剩余的人,如果 candidate knows  i, 排除当前candidate,换成i;否则排除i, candidate不变

3)不变式:已经考察过的人,要么被排除是名人的可能性,要么在candidate里

4)循环结束时,只有剩下的candidate没有确定,单独验证之。

bool knows(int a, int b);int celebrity(int n) {int x = 0;for (int i = 1; i < n; ++i) {if (knows(x, i)) i = x;}for (int i = 0; i < n; ++i) {if (i != x && knows(x, i) || !knows(i, x)) return -1;}return x;}



0 0
原创粉丝点击