zoukankan      html  css  js  c++  java
  • 认老乡

    题目描述(数据结构)

    大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?

    输入

    每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系;
    在接下来的M行里,每行包括2个整数,a,b,代表a跟b是同乡;
    当N = 0,M = 0输入结束;
    已知1表示小赛本人。

    输出

    对于每个测试实例,输出一个整数,代表确定是小赛同乡的人数。
    样例输入
    3 1
    2 3
    5 4
    1 2
    3 4
    2 5
    3 2
    0 0

    样例输出

    0
    4

    破题思路

    本题主要涉及两个函数:分组函数、查找函数
    其它设置:存放老乡的集合(set)

    程序源码

    import sys
    
    #转化输入数据成一个列表
    inputs = list(map(lambda x: list(map(int, x.strip().split(' '))), sys.stdin.readlines()))
    #map(:将输入的数据分行转换成整形数值
    #map(lambda x:list(:将每行数据转换成列表
    #list(:再将小列按顺序表组合成一个大的列表
    #Input的最终形式:[[N1,M1],[1,2],[3,1],[N2,M2],[1,3],[2,4],[5,6]],其中N1=3,M1=2,N2=6,M1=3
    #将输入的数据进行切片并分组存放[[[1,2],[3,1]],[[1,3],[2,4],[5,6]]]
    def slice(inputs):
       i = 0
       while True:
            n,m = inputs[i]
            if n == 0 and m == 0:
              break
    #生成迭代器
            yield inputs[i+1:i+1+m]
            i += m+1
          
    #查找组中其他人与某一人的关系
    def find(datas, lx):
       while 1:
           old_len = len(lx)
           for a,b in datas: #当x=a,b,则print(x)为[a,b]
                if a in lx or b in lx:
                   lx.add(a)
                   lx.add(b)
    #当set集合的长度不在变化时说明该人的老乡已经全部查找完毕(第一次查找不一定能将所有的老乡加入进老乡集合:因为每条关系的局限性,不能一次将所有的关系连接起来)
           if (len(lx) - old_len) ==0:
               break
    
    for data in slice(inputs):
        lx = set([1])
        find(data, lx)
        print(len(lx)-1)
    
  • 相关阅读:
    3月1日起执行!江苏居民阶梯电价有变化!
    个体工商户需要报税吗?
    西红柿的选购方法
    正常人一天该走六千还是一万步?步数滚蛋,运动强度和时长才重要,锻炼身体,快走
    NAT四种类型以及提高NAT类型的途径和方法 nat1 nat2 nat3 nat4
    6种沙坦类药物有什么区别, 选哪一种更好? 药师一次说清楚
    心脏神经官能症是什么症状
    呼吸性碱中毒
    Python Serverless 开源框架:Zappa(详细教程)
    不用代码趣讲 ZooKeeper 集群
  • 原文地址:https://www.cnblogs.com/wisteria68/p/12339657.html
Copyright © 2011-2022 走看看