认老乡
Posted wisteria68
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了认老乡相关的知识,希望对你有一定的参考价值。
题目描述(数据结构)
大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?
输入
每个测试实例首先包括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)
以上是关于认老乡的主要内容,如果未能解决你的问题,请参考以下文章