• 认老乡


    题目描述(数据结构)

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

    输入

    每个测试实例首先包括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)
    
  • 相关阅读:
    rabbitMQ 的简单模式
    redis 的发布订阅
    redis 的管道操作
    redis 的其他常用操作
    redis 的链表操作
    redis 的哈希操作
    redis 的字符串操作
    redis 的数据类型
    Redis的基本操作
    day27 的笔记和day 25 的保持一致
  • 原文地址:https://www.cnblogs.com/wisteria68/p/12339657.html
Copyright © 2020-2023  润新知