赞
踩
class Solution {
public:
bool validTree(int n, vector<vector<int>>& edges) {
}
};
思路
DFS
class Solution { std::vector<bool>visited; int count = 0; void dfs(std::vector<std::vector<int>> &graph, int point){ if(visited[point]){ return; } visited[point] = true; count++;; for(int neighbor : graph[point]){ dfs(graph, neighbor ); } } public: bool validTree(int n, vector<vector<int>>& edges) { if(edges.empty() || edges.size() != n - 1){ return false; } std::vector<std::vector<int>> graph(n, std::vector<int>(n)); for(auto e : edges){ graph[e[0]].push_back(e[1]); graph[e[1]].push_back(e[0]); } visited.resize(n); return count == n; } };
使用并查集,当一条边的两个节点已经处于联通状态时,新加的边就肯定构成了环。
class Solution { public: bool validTree(int n, vector<vector<int>>& edges) { UF uf(n); // 遍历所有边,将组成边的两个节点进行连接 for(int i=0;i<edges.size();++i){ int p=edges[i][0]; int q=edges[i][1]; // 若两个节点已经在同一连通分量中,会产生环 if(uf.connected(p,q)){ return false; } // 这条边不会产生环,可以是树的一部分 uf.Union(p,q); } // 要保证最后只形成了一棵树,即只有一个连通分量 return uf.count==1; } class UF{ public: UF(int n){ count=n; for(int i=0;i<n;++i){ parent.push_back(i); size.push_back(1); } } void Union(int p,int q){ int rootp=find(p); int rootq=find(q); if(rootp==rootq){ return; } if(size[rootp]>size[rootq]){ size[rootq]+=size[rootp]; parent[rootp]=rootq; }else{ size[rootq]+=size[rootp]; parent[rootq]=rootp; } count--; } int find(int x){ while(x!=parent[x]){ parent[x]=parent[parent[x]]; x=parent[x]; } return x; } bool connected(int p,int q){ int rootp=find(p); int rootq=find(q); return rootp==rootq; } int count; vector<int> parent; vector<int> size; }; };
题目 | 思路 |
---|---|
leetcode:200. 岛屿数量 Number of Islands | dfs、并查集 |
leetcode:261. 以图判树 Graph Valid Tree | |
leetcode:990. 等式方程的可满足性 Satisfiability of Equality Equations | |
leetcode:685. 冗余连接 II Redundant Connection II |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。