《Python 算法教程》笔记 - 找明星算法

# 找明星问题
# 10个人中只有一个明星,大家都认识明星,明星不认识任何人。

from random import randrange

#直接法,两两判断
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

#优化思路:G[u][v]为真,说明u肯定不是明星,否则v肯定不是明星
def celeb(G):
    u,v = 0,1
    n = len(G)
    for c in range(2,n+1): #从第3个开始 以次判断
        if G[u][v]:  #如果u认识v,则u肯定不是明星,往后累加
            u = c
        else:
            v = c #否则u可能是明星,v肯定不是明星,往后累加
    if u == n: #累加到最后,只剩下u和v,u不是明星,说明v是明星
        c = v
    else:
        c = u

    #其实到这里已经能确定c就是明星了,下面的过程再判断一遍

    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


n = 10 #人数

# 构造数据结构,使用二维数组
G = [[randrange(2) for i in range(10)] for i in range(10)]

c = randrange(10) # 指定一位明星
print(c)

#设置关系
for i in range(10):
    G[i][c] = True #所有人都认识明星
    G[c][i] = False #明星不认识所有人

for i in G:
    print(i)

cc = naive_celeb(G)
print(cc)

cc = celeb(G)
print(cc)
posted on 2017-02-09 16:31 bvac 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/bvac/p/6382761.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值