给出 n
个节点,标号分别从 0
到 n - 1
并且给出一个 无向
边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
样例
给出n = 5
并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
, 返回 true.
给出n = 5
并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
, 返回 false.
注意
你可以假设我们不会给出重复的边在边的列表当中. 无向
边 [0, 1]
和[1, 0]
是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。
const int NUM = 2000;
bool visited[NUM];
bool hasEdge[NUM][NUM];
class Solution {
public:
/**
* @param n an integer
* @param edges a list of undirected edges
* @return true if it's a valid tree, or false
*/
bool validTree(int n, vector<vector<int>>& edges) {
// Write your code here
memset(visited, false, sizeof(visited));
memset(hasEdge, false, sizeof(hasEdge));
for (int i = 0; i < edges.size(); i++)
{
hasEdge[edges[i][0]][edges[i][1]] = true;
hasEdge[edges[i][1]][edges[i][0]] = true;
}
if (!check(0, -1, n))
{
return false;
}
for (int i = 0; i < n; i++)
{
if (!visited[i])
{
return false;
}
}
return true;
}
private:
bool check(int a, int b, int n)
{
if (visited[a])
{
return false;
}
visited[a] = true;
for (int i = 0; i < n; i++)
{
if (hasEdge[a][i] && i != b)
{
if (visited[i])
{
return false;
}
else
{
if (!check(i, a, n))
{
return false;
}
}
}
}
return true;
}
};