分类比较复杂,整体来讲比较简单
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()