今天做美团笔试,小白啊真的是菜!之前一直没来得及看图 都是我的锅 都是我的锅
结束以后恶补了两小时图的基本知识和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))