[LeetCode] Graph Valid Tree
2015-09-06 11:17
253 查看
Graph Valid Tree
Given
For example:
Given
Given
Hint:
Given
According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
Note: you can assume that no duplicate edges will appear in
首先要判断是不是只有一个连通分支,如果不是肯定不是树,如果只有一个连通分支,再判断分支内有没有环,如果没有环,那么就是树。求连通分支个数用并查集,判断是否有环用DFS。
Given
nnodes labeled from
0to
n - 1and 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 = 5and
edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return
true.
Given
n = 5and
edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return
false.
Hint:
Given
n = 5and
edges = [[0, 1], [1, 2], [3, 4]], what should your return? Is this case a valid tree?
According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
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.
首先要判断是不是只有一个连通分支,如果不是肯定不是树,如果只有一个连通分支,再判断分支内有没有环,如果没有环,那么就是树。求连通分支个数用并查集,判断是否有环用DFS。
class Solution { public: int findFather(vector<int> &father, int x) { while (x != father[x]) x = father[x]; return x; } bool dfs(vector<vector<int>> &graph, vector<bool> &visit, int u, int f) { visit[u] = true; for (auto v : graph[u]) if (v != f) { if (visit[v]) return false; else if (!dfs(graph, visit, v, u)) return false; } return true; } bool validTree(int n, vector<pair<int, int>>& edges) { vector<int> father(n); for (int i = 0; i < n; ++i) father[i] = i; for (auto edge : edges) { int fa = findFather(father, edge.first), fb = findFather(father, edge.second); if (fa < fb) father[fb] = fa; else father[fa] = fb; }; int cnt = 0; for (int i = 0; i < n; ++i) { if (i == father[i]) ++cnt; if (cnt > 1) return false; } vector<vector<int>> graph(n); vector<bool> visit(n, false); for (auto edge : edges) { int u = edge.first, v = edge.second; graph[u].push_back(v); graph[v].push_back(u); } return dfs(graph, visit, 0, -1); } };
相关文章推荐
- 快速排序(五)
- hadoop 常用配置
- 西风的数据结构教程(3)——二叉树
- JAVA经典面试题:四线程写四个文件
- 如何获取app 的包名和activity 名
- Alipay(支付宝)接口相关
- LeetCode -- Delete Node in a Linked List
- C#学习笔记
- Dictionary 字典的使用
- MySQL联合查询语法内联、左联、右联、全联
- AVL实现平衡二叉树
- 大一新生的开学日记
- PL/SQL Developer如何连接64位的Oracle图解
- Windows 万能守护进程
- APK 的安装与卸载
- 数据库(第一范式,第二范式,第三范式)
- yii2 集成mongodb
- lamp环境编译(实际通过)
- 局部变量传参数
- VBA 打开带密码的文件