无向图中找到长度为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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章