文章

5

粉丝

495

获赞

1

访问

44.7k

头像
1566-确定比赛名次(Python实现)
P1566 中山大学2019年机试题
发布于2021年3月3日 12:58
阅读数 11.0k

思路分析:
本题的题意是根据每行输入的部分次序关系,从而还原整个比赛程序的次序关系。刻画问题时,可以将队编号用结点表示,对之间的次序关系用有向边表示,那么每行输入的P1,P2表示P1队赢了P2队,就可以表示为P1→P2。这样M行的输入数据实际上就是给出的M条有向边。这样问题的全局表示就刻画出来了,实际上是一张有向无环图。接下来确定全局次序关系的思路是,每一步扫描所有没有前驱结点的结点,这些结点是“候选第1名”,从中选取序号最小的,计入结果列表,它就是全局第1名,然后将此结点从图中删除,并把该结点发出的所有边删除。重复此过程直至所有边删除完毕,最后剩余的结点再按照标号从小到大排序,并入到结果列表中

实现方法:

  • 本题使用Python语言,图的模拟采用字典这一数据结构。
  • pre_dic字典中键表示结点编号,值表示该结点的前驱集合(列表)。列表为空则表示没有前驱结点;
  • nexte_dic字典中键表示结点编号,值表示该节点的后继集合。
  • 删除结点时从pre_dic字典删除键(用pop方法)即可。
  • 删除边的方法比较复杂:例如删除结点node发出的所有边,首先找出node的所有后继结点,然后到pre_dic字典中访问每这些结点的前驱列表,逐一删除node号结点(用remove方法)。

参考程序:

def Out(ls):
    for i in range(len(ls) - 1):
        print(ls[i], end=" ")
    print(ls[-1])


while True:
    try:
        N, M = map(int, input().split())
        pre_dic = {}
        next_dic = {}
        for i in range(1, N + 1):
            pre_dic[i] = []
            next_dic[i] = []
        for i in range(M):
            a, b = map(int, input().split())
            pre_dic[b]....
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发