认老乡

题目描述(数据结构)

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

输入

每个测试实例首先包括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)

猜你喜欢

转载自www.cnblogs.com/wisteria68/p/12339657.html