LeetCode 261. 以圖判樹(全部連通+邊數=V-1)

文章目錄

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. 解題

請參考:數據結構–並查集(Disjoint-Set)

  • 採用並查集判斷連通,還可以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阿明),一起加油、一起學習進步!
Michael阿明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章