ACwing-每日一题打卡第三题-python-(bfs)

分类比较复杂,整体来讲比较简单

dic={'Ox': 1, 'Tiger': 2, 'Rabbit': 3, 'Dragon': 4, 'Snake': 5, 'Horse': 6, 'Goat': 7, 'Monkey': 8, 'Rooster': 9, 'Dog': 10, 'Pig': 11, 'Rat': 12}
n=int(input())
side=[[] for i in range(n)]

#记录一共出现了几个名字
namedic=set()

#记录每个牛的生肖
animal={"Bessie":"Ox"}
for i in range(n):
    msg=list(input().split(" "))
    # 谁 在 谁 的 之前/之后 某年出生
    side[i]+=[msg[0],msg[-1],msg[3],msg[4]]
    animal[msg[0]]=msg[4]

    namedic.add(msg[0])
    namedic.add(msg[-1])

visit={}
value={}
#所有牛标记为未被访问
for name in namedic:
    visit[name]=0
    value[name]=0
#初始化边的存储
point={}
for i in range(n):
    u,v=side[i][0],side[i][1]
    if u in point:
        point[u].append(i)
    else:
        point[u]=[i]
    if v in point:
        point[v].append(i)
    else:
        point[v]=[i]
#从 Bessie 结点开始广度优先搜索直到搜索到  Elsie

def bfs():
    visit["Bessie"]=1
    queue=[]
    queue.append("Bessie")
    while len(queue)!=0:
        front=queue.pop(0)
        if front=="Elsie":
            print(abs(value["Elsie"]-value["Bessie"]))
            break
        lth=len(point[front])
        #枚举与队首结点相连的所有边 如果未被访问 根据边的信息更新其对应的value值
        for i in range(lth):
            u,v,sq,an=side[point[front][i]][0],side[point[front][i]][1],side[point[front][i]][2],side[point[front][i]][3]
            if v==front:
                if not visit[u]:
                    queue.append(u)
                    visit[u]=1

                    #front 在 u 之前出生
                    if sq=="previous":
                        if dic[animal[u]]<dic[animal[v]]:
                            value[u]=value[v]+dic[animal[v]]-dic[animal[u]]
                        else:
                            value[u]=value[v]+12-(dic[animal[u]]-dic[animal[v]])
                    #front 在 u 之后出生
                    else:
                        if dic[animal[u]]>dic[animal[v]]:
                            value[u]=value[v]+dic[animal[v]]-dic[animal[u]]
                        else:
                            value[u]=value[v]-(12-(dic[animal[v]]-dic[animal[u]]))
            else:
                if not visit[v]:
                    queue.append(v)
                    visit[v]=1

                    #front 在 v 之前出生
                    if sq=="previous":
                        if dic[animal[u]]<dic[animal[v]]:
                            value[v]=value[u]-dic[animal[v]]+dic[animal[u]]
                        else:
                            value[v]=value[u]-(12-(dic[animal[u]]-dic[animal[v]]))
                    #front 在 v 之后出生
                    else:
                        if dic[animal[u]]>dic[animal[v]]:
                            value[v]=value[u]+dic[animal[u]]-dic[animal[v]]
                        else:
                            value[v]=value[u]+(12-(dic[animal[v]]-dic[animal[u]]))
bfs()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值