首页 > 试题广场 >

火眼金睛

[编程题]火眼金睛
  • 热度指数:10328 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现在我们需要查出一些作弊的问答社区中的ID,作弊有两种:1.A回答了B的问题,同时B回答了A的问题。那么A和B都是作弊。2.作弊ID用户A和作弊ID用户B同时回答了C的问题,那么C也是作弊。已知每个用户的ID是一串数字,一个问题可能有多个人回答。

输入描述:
每组数据第一行为总问题数N(N小于等于200000),第二行开始每行一个问题,第一个数字为提问人ID,第二个数字为回答人数,后面则为所有回答人的ID。(ID均为0-1000000的整数)


输出描述:
第一行为作弊ID数量,第二行开始为从小到大的每行一个作弊ID。
示例1

输入

3
1 1 2
2 1 1
3 2 1 2

输出

3
1 2 3
while True:
    try:
        qnum=int(input())
        askId,ansNum=[0 for i in range(qnum)],[0 for i in range(qnum)]
        wenda=[[0 for i in range(qnum+1)] for j in range(qnum+1)]
        for i in range(qnum):
            tmp=list(map(int,input().split()))
            askId[i],ansNum[i]=tmp[0],tmp[1]
            temp=2
            for j in range(ansNum[i]):
                ansId = tmp[temp]
                temp+=1
                wenda[askId[i]][ansId]=1
        result=[]
        for i in range(qnum+1):
            count=0
            for j in range(qnum+1):
                if wenda[i][j]==1 and wenda[j][i]==1 and i!=j and i not in result:
                    count+=1
                    result.append(i)
                if wenda[i][j]==1 and i!=j and j in result:
                    count+=1
                if count>=2 and i not in result:
                    result.append(i)
        result=[str(i) for i in result]
        print(len(result))
        print(' '.join(result))
    except:
        break
    

发表于 2022-06-16 11:02:19 回复(0)