zoukankan      html  css  js  c++  java
  • 无向图中找到长度为k的“链”

    今天做美团笔试,小白啊真的是菜!之前一直没来得及看图 都是我的锅 都是我的锅

    结束以后恶补了两小时图的基本知识和bfs、dfs的基本原理与实现后把这个题做出来了。也不知道对不对,但是大致上理解应该是差不多的

    美团笔试的题内容大概就是

    给出几个结点和边,组成无向图

    求出这个无向图所有长度为k的序列个数(大概是这个意思),这题里k=5

    思路是:

    首先根据每一个结点都走一遍dfs,走过的结点不走;新建一个seen set记录中间看过的结点

    然后记录长度为k的所有结果放到另一个结果set中

    存放之前对每一个结果进行排序(比如走的顺序是5 1 3 2 4,排完以后就是 1 2 3 4 5)

    这样是为了筛选出来长度为k的链唯一,而且深度遍历的结果必定是链

    输入n、m,分别是n个点,一共m条边

    输入的时候要使用下面的写法来实现读入 “n m”这种形式的数字!以后面试题可能会经常用的这种写法,好好记着辣

    n,m=map(int,input().split())

    代码实现如下:

    def sort_str(str):
        strl=list(str)
        for i in strl:
            i=int(i)
        strl.sort()
        str2="".join(strl)
        return str2
    # m="23145"
    # print(sort_str(m))
    
    def DFS(graph,s):
        stack = []
        # 所有结点入队
        stack.append(s)
        set_que = ""
        set_Q = set()
        # 记录看过的结点
        seen = set()
        seen.add(s)
        while (len(stack) > 0):
            # 每次拿一个结点出来
    
            vertex = stack.pop()
            # 结点的邻接点
            nodes = graph[vertex]
            for w in nodes:
                if w not in seen:  # 如果w没挖掘过,就放进去
                    stack.append(w)
                    seen.add(w)
            set_que += str(vertex)
            if len(set_que) == 5:
                set_que=sort_str(set_que)
                set_Q.add(set_que)
    
                set_que = ""
            # print(vertex)
        return set_Q
    
    if __name__ == '__main__':
        n,m=map(int,input().split())
        M=[[0 for i in range(n)] for j in range(n)]
        # print(M)
        graph_M={}
        for i in range(0,m):
            h, z = map(int, input().split())
    
            if h in graph_M:
                graph_M[h].append(z)
            else:
                graph_M[h]=[]
                graph_M[h].append(z)
            if z in graph_M:
                graph_M[z].append(h)
            else:
                graph_M[z]=[]
                graph_M[z].append(h)
    
        set_S=set()
        # print(graph_M)
    
        for i in graph_M.keys():
            Q=DFS(graph_M,i)
            for i in Q:
                set_S.add(i)
        # print(set_S)
    
        print(len(set_S))

     

  • 相关阅读:
    机器学习--k-means聚类原理
    机器学习--朴素贝叶斯模型原理
    关联分析原理小结
    批发经销商客户价值细分
    员工离职预测
    共享单车租赁需求预测
    蓝桥杯 区间k大数查询
    蓝桥杯 猴子吃包子
    java计算程序运行时间
    leetcode 185周周赛 字节专场
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/15310565.html
Copyright © 2011-2022 走看看