解法一 DFS
class Solution {
public:
bool validTree(int n, vector<pair<int, int>>& edges) {
vector<unordered_set<int>> g(n, unordered_set<int>());
vector<bool> v(n, false);
for(auto a: edges){
g[a.first].insert(a.second);
g[a.second].insert(a.first);
}
if(!helper(g, v, 0, -1)) return false;
for(auto a:v){
if(!a) return false;
}
return true;
}
bool helper(vector<unordered_set<int>> &g, vector<bool> &v, int cur, int pre){
if(v[cur]) return false;
v[cur] = true;
for(auto a: g[cur]){
if(a!=pre)
if(!helper(g, v, a, cur)) return false;
}
return true;
}
};
解法二 BFS
class Solution {
public:
bool validTree(int n, vector<pair<int, int>>& edges) {
vector<unordered_set<int>> g(n, unordered_set<int>());
unordered_set<int> s;
queue<int> q{{0}};
for(auto a: edges){
g[a.first].insert(a.second);
g[a.second].insert(a.first);
}
while(!q.empty()){
int node = q.front(); q.pop();
if(s.count(node)) return false;
else s.insert(node);
for(auto a: g[node]) {
q.push(a);
g[a].erase(node);
}
}
return s.size()==n;
}
};
解法三 Union Find
class Solution {
public:
bool validTree(int n, vector<pair<int, int>>& edges) {
vector<int> u(n, -1);
for(auto a: edges){
int x = find(u, a.first), y = find(u, a.second);
if(x==y) return false;
u[x] = y;
}
return edges.size()==n-1;
}
int find(vector<int>& u, int i){
while(u[i]!=-1) i=u[i];
return i;
}
};