京东笔试题-完全多部图

第二题AC。

思路:对于每个测试用例,我们用一个字典去存储,字典的key是所有的结点,每一个结点的值是一个list,保存的是所有跟key有边相连的结点。字典构造完之后把每个key对应的list进行排序。再之后,我们把有着相同list的值放到一起,这个子集就有可能是最后的子集,同时把这个list也存下来。最后我们得到ret和ret2两个list,ret中的每个元素是ret[i]一个list,这个list中的所有元素在字典中有着相同的value,且ret2即为这个value。最后遍历ret,如果set(range(1, N+1)).difference(ret[i]) != ret2[i],则可以返回No。遍历到最后如果没有出现不等的情况,则可以打印Yes了。

import sys
T = int(sys.stdin.readline().strip())
examples = []
nums = []
for i in range(T):
    N, M = map(int, sys.stdin.readline().split())
    lines = []
    for j in range(M):
        x, y = map(int, sys.stdin.readline().split())
        lines.append([x, y])
    examples.append(lines)
    nums.append([N, M])
for t in range(T):
    lines = examples[t]
    N, M = nums[t]
    dic = {}
    for i in range(1, N+1):
        dic[i] = []
    for i in range(M):
        x, y = lines[i]
        dic[x].append(y)
        dic[y].append(x)
    for i in dic.keys():
        dic[i].sort()
    ret = []
    ret2 = []
    for i in dic.keys():
        flag = False
        for j in range(len(ret2)):
            if dic[i] == ret2[j]:
                ret[j].append(i)
                flag = True
                break
        if not flag:
            ret.append([i])
            ret2.append(dic[i])
    retflag = True
    n = len(ret)
    for i in range(len(ret)):
        set1 = ret[i]
        set1 = list(set(list(range(1, N+1))).difference(set(set1)))
        set1.sort()
        set2 = ret2[i]
        if set1 != set2:
            retflag = False
            break
    if retflag:
        print('Yes')
    else:
        print('No')
#京东#
全部评论

相关推荐

学历算污点吗?
小何和:快毕业了,BOSS上的od闻着味就来了
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-23 18:30
美团优选内容调整,屁股都没离开座椅呢,多多买菜来挖了
熬夜脱发码农:哈,拼多多真挖人是吧
投递美团等公司8个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务