当前位置:   article > 正文

python--lintcode178. 判断图是否是树_python 判断一个图是否是树

python 判断一个图是否是树

给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树

 注意事项

你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1]和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。

样例

给出n = 5 并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]], 返回 true.

给出n = 5 并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], 返回 false.

这一题的思路就是用BFS去做,如果一个图是树的话,它的结点个数是n,那么它的边的个数一定是n-1,并且这n个结点一定是联通的,联通的意思就是从某个结点出发遍历一遍这个图,得到的集合里有n个结点。

所以思路明确了,就可以写代码了,请注意这一题只给了边的数组,所以我们需要自己来构建图的数据结构:

  1. class Solution:
  2. """
  3. @param n: An integer
  4. @param edges: a list of undirected edges
  5. @return: true if it's a valid tree, or false
  6. """
  7. def validTree(self, n, edges):
  8. # write your code here
  9. if(n==1):return True
  10. if(len(edges)!=n-1):return False
  11. dic={}
  12. for i in range(n):
  13. dic[i]=set() #集合里存储与该点连接的点
  14. def getGraph(dic,n,edges): #获得图
  15. for i in range(len(edges)):
  16. u=edges[i][0]
  17. v=edges[i][1]
  18. dic[u].add(v)
  19. dic[v].add(u)
  20. return dic
  21. graph=getGraph(dic,n,edges) #dic{i:set}
  22. from queue import Queue
  23. q=Queue()
  24. q.put(0)
  25. traversal=set() #记录已经遍历过的点
  26. while(q.qsize()!=0):
  27. node=q.get()
  28. for neighbor in graph[node]:
  29. if(neighbor in traversal):continue
  30. q.put(neighbor)
  31. traversal.add(neighbor)
  32. return(len(traversal)==n)
  33. s = Solution()
  34. print(s.validTree(5,[[0, 1], [0, 2], [0, 3], [1, 4]]))


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/656084
推荐阅读
相关标签
  

闽ICP备14008679号