首页 > 代码库 > 261. Graph Valid Tree
261. Graph Valid Tree
题目:
Given n
nodes labeled from 0
to n - 1
and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.
For example:
Given n = 5
and edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, return true
.
Given n = 5
and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, return false
.
Hint:
- Given
n = 5
andedges = [[0, 1], [1, 2], [3, 4]]
, what should your return? Is this case a valid tree? Show More Hint
Note: you can assume that no duplicate edges will appear in edges
. Since all edges are undirected, [0, 1]
is the same as [1, 0]
and thus will not appear together in edges
.
链接: http://leetcode.com/problems/graph-valid-tree/
5/13/2017
算法班,抄答案
被hashCode跑偏了,没有想起来怎么做这道题。
最后用顶点做hashset比用边要好。因为用边不容易检测到环。
http://www.jiuzhang.com/solutions/graph-valid-tree/
1 public class Solution { 2 3 public boolean validTree(int n, int[][] edges) { 4 // make sure E == V - 1 5 if (edges == null || edges.length != n - 1) { 6 return false; 7 } 8 Map<Integer, Set<Integer>> graph = initializeGraph(n, edges); 9 Queue<Integer> queue = new LinkedList<Integer>(); 10 Set<Integer> set = new HashSet<Integer>(); 11 queue.offer(0); 12 set.add(0); 13 14 while (!queue.isEmpty()) { 15 Integer v = queue.poll(); 16 for (Integer neighbor: graph.get(v)) { 17 if (!set.contains(neighbor)) { 18 queue.offer(neighbor); 19 set.add(neighbor); 20 } 21 } 22 } 23 return set.size() == n; 24 } 25 private Map<Integer, Set<Integer>> initializeGraph(int n, int[][] edges) { 26 Map<Integer, Set<Integer>> map = new HashMap<>(); 27 28 for (int i = 0; i < n; i++) { 29 map.put(i, new HashSet<Integer>()); 30 } 31 for (int i = 0; i < edges.length; i++) { 32 int e = edges[i][0]; 33 int o = edges[i][1]; 34 map.get(e).add(o); 35 map.get(o).add(e); 36 } 37 return map; 38 } 39 }
顺便实现了一次hashCode
1 class Edge { 2 final int either, other; 3 Edge(int[] edge) { 4 if (edge[0] < edge[1]) { 5 this.either = edge[0]; 6 this.other = edge[1]; 7 } else { 8 this.other = edge[0]; 9 this.either = edge[1]; 10 } 11 } 12 @Override 13 public boolean equals(Object obj) { 14 if (obj == null) return false; 15 if (!(obj instanceof Edge)) return false; 16 Edge o = (Edge) obj; 17 if (o.either == this.either && o.other == this.other) { 18 // because we already ordered the two V, no need to check other direction 19 return true; 20 } 21 return false; 22 } 23 @Override 24 public int hashCode() { 25 int hash = 7; 26 hash = 71 * hash + this.either; 27 hash = 71 * hash + this.other; 28 return hash; 29 } 30 }
还有union-find的方法。
261. Graph Valid Tree