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.

 Notice

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.

Example

Given n = 5 andedges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.

Given n = 5 andedges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.

 

Runtime: 213ms

 1 class Solution {
 2 public:
 3     /**
 4      * @param n an integer
 5      * @param edges a list of undirected edges
 6      * @return true if it's a valid tree, or false
 7      */
 8     bool validTree(int n, vector<vector<int>>& edges) {
 9         // Write your code here
10         
11         // use union find to solve this problem.
12         // initialize the the union find array
13         if (!n) return true;
14         vector<int> uf;
15         for (int i = 0; i < n; i++)
16             uf.push_back(i);
17         
18         // change the parent of all pairs accordingly
19         vector<bool> visited(n, false);
20         for (int i = 0; i < edges.size(); i++) {
21             if (visited[edges[i][0]] && visited[edges[i][1]] && uf[edges[i][0]] == uf[edges[i][1]]) return false;
22             updateFather(uf, edges[i][0], edges[i][1]); // The order of these lines are important!!!
23             visited[edges[i][0]] = true;
24             visited[edges[i][1]] = true;
25         }
26         
27         // check whether have multiple fatheres
28         int father = uf[0];
29         for (int i = 1; i < n; i++) {
30             if (uf[i] != father) return false;
31         }
32         return true;
33     }
34     
35     void updateFather(vector<int>& uf, int from, int to) {
36         int temp = uf[to];
37         for (int i = 0; i < uf.size(); i++) {
38             if (uf[i] == temp) uf[i] = uf[from];
39         }
40     }
41 };

 

转载于:https://www.cnblogs.com/amazingzoe/p/5816665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值