1. 題目
給定從 0 到 n-1 標號的 n 個結點,和一個無向邊列表(每條邊以結點對來表示),
請編寫一個函數用來判斷這些邊是否能夠形成一個合法有效的樹結構。
示例 1:
輸入: n = 5, 邊列表 edges = [[0,1], [0,2], [0,3], [1,4]]
輸出: true
示例 2:
輸入: n = 5, 邊列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
輸出: false
注意:你可以假定邊列表 edges 中不會出現重複的邊。
由於所有的邊是無向邊,邊 [0,1] 和邊 [1,0] 是相同的,
因此不會同時出現在邊列表 edges 中。
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/graph-valid-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2. 解題
- 採用並查集判斷連通,還可以BFS、DFS
class dsu
{
vector<int> f;
public:
dsu(int n)
{
f.resize(n);
for(int i = 0; i < n; ++i)
f[i] = i;
}
void merge(int a, int b)
{
int fa = find(a), fb = find(b);
f[fa] = fb;
}
int find(int a)
{
int origin = a;
while(a != f[a])
a = f[a];
return f[origin] = a;
}
int countUni()
{
int count = 0;
for(int i = 0; i < f.size(); ++i)
if(i == find(i))
count++;
return count;
}
};
class Solution {
public:
bool validTree(int n, vector<vector<int>>& edges) {
dsu u(n);
for(auto& e : edges)
u.merge(e[0], e[1]);
return edges.size()+1==n && u.countUni()==1;
}
};
20 ms 10.7 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公衆號(Michael阿明),一起加油、一起學習進步!