在人群中找出以为明星人士。该明星不认识其他人群中的其他人,但是人人都认识这位明星。
暴力求解方案:
def naive_celeb(G): n = len(G) for u in range(n): for v in range(n): if u ==v:continue if G[u][v]: break if not G[v][u]:break else: return u return None 12345678910
为了将问题规模将n简化到n-1,我们就必须先找一位非明星人士,也就是说,要么这个人认识某人,要么谁也不认识。
1.也就是如果我们检查u、v中任何一个节点的G[u][v],就可以排除一个节点
2.如果G[u][v]为True,我们就排除u否则排除v。
接下来我们能确保其中存在一位明星人士就足够了。否则,我们仍需要继续排除那位候选者以外的所有人,但是我们需要通过检查他们是否是明星来完成这件事。
解决方案:
def celeb(G): n = len(G) u,v = 0,1 for c in range(2,n+1): if G[u][v]:u=c else:v=c if u==n:c=v else:c=u for v in range(n): if c==v:continue if G[c][v]:break if not G[v][c]:break else: return c return None from random import randrange n =100 G = [[randrange(2) for i in range(n)] for i in range(n)] c = randrange(n) for i in range(n): G[i][c] = True G[c][i] = False print(naive_celeb(G)) --54 print(celeb(G)) ---54
123456789101112131415161718192021222324随机的,结果不一定是54