今天做美團筆試,小白啊真的是菜!之前一直沒來得及看圖 都是我的鍋 都是我的鍋
結束以後惡補了兩小時圖的基本知識和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))