您的位置:首页 > 其它

[LeetCode] Graph Valid Tree

2015-09-06 11:17 253 查看
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
and
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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: