赛码网输入输出联系(python版)附动脑子认老乡习题

这是一道关于通过输入输出找出老乡的算法题,来源于赛码网。给定人数N和关系M,以及每对是否同乡的信息,目标是确定小赛有多少同乡。题目要求使用Python解决,通过排序和遍历实现,时间复杂度为O(nlogn)。样例输入和输出分别给出了不同情况的结果。

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

输入:
包含多组测试用例。
对于每组测试用例:
第一行包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括3个整数,a,b, c,如果c为1,则代表a跟b是同乡;如果c为0,则代表a跟b不是同乡;

已知1表示小赛本人。

样例输入
3 1
2 3 1
5 4
1 2 1
3 4 0
2 5 1
3 2 1

输出:

对于每组测试实例,输出一个整数,代表确定是小赛同乡的人数。

样例输出
0
3

#赛码网输入输出模板,输入用input()函数读入,输出用print()输出
while True:
    first_line = list(map(int,input().split("")))
    N = first_line[0]
    M = first_line[1]
    print(str(N)+' '+str(M))
    for i in range(N):
        other_line = list(map(int,input().split("")))
        a = other_line[0]
        b = other_line[1]
        c = other_line[1]
        print(str(a)+' '+str(b)+' '+str(c))

题目来源

赛码网输入输出联系

题解
排序+遍历,复杂度由排序决定,O(nlogn)

#循环测试样例
while True:
	#每个样例第一行是人数和组数
    first_line = list(map(int,input().split(" ")))
    N = first_line[0]
    M = first_line[1]
    res = []
    for i in range(M):
        other_line_temp = list(map(int,input().split()))
        a, b, c = other_line_temp[0],other_line_temp[1],other_line_temp[2]
        #挑选有效组并排序
        if c == 1:
            r = [a, b] if a < b else [b, a]
            res.append(r)
	#排序
    s = set()
    s.add(1)
    res.sort()
	#一次遍历寻找同乡
    for i in res:
    	#两人之中有一个同乡,则都是同乡
        for j in (0,1):
            if i[j] in s:
            	#认识的同乡加入同乡集合,同乡的同乡还是同乡
                s.add(i[1-j])
    print(len(s) - 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值