無向圖中找到長度爲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))

 

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