forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsungjinwi.cpp
More file actions
62 lines (50 loc) ยท 2.1 KB
/
sungjinwi.cpp
File metadata and controls
62 lines (50 loc) ยท 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
ํ์ด :
graph๊ฐ tree๊ฐ ๋๋ ค๋ฉด ๋ชจ๋ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์์ด์ผํ๊ณ ์ํ์ด ์์ด์ผํ๋ค
๊ฐ์ ์ด ๋
ธ๋ ๊ฐ์ n - 1๋ณด๋ค ์์ผ๋ฉด ๋ชจ๋ ๋
ธ๋ ์ฐ๊ฒฐ ๋ถ๊ฐ๋ฅ, ํฌ๋ฉด ๋ฌด์กฐ๊ฑด ์ํ์ด ์๊ธด๋ค
๊ฐ์ ์ด n - 1๊ณผ ๋์ผํ ๋ ์ํ์ด ์์ผ๋ฉด valid tree๋ผ๊ณ ํ๋จ ๊ฐ๋ฅ
Union-find ์ฌ์ฉ
- ์์ํ ๋ ๊ฐ ๋
ธ๋๋ ์๊ธฐ ์์ ์ parent(root)๋ก ๊ฐ์ง๋ค
- ๋
ธ๋๊ฐ ์๋ก ์ฐ๊ฒฐ๋์์ผ๋ฉด ํ union์ผ๋ก ํฉ์น ๋ค ํ๋์ parent๋ก ์
๋ฐ์ดํธํ๋ค
- ์ด๋ฅผ ํตํด ํ parent๋ฅผ ๊ฐ์ง๋ ํ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด๊ฒ ๋๋ค
find ํจ์๋ ํ ๊ทธ๋ฃน ์ ์ฒด์ parent๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ ๋
ธ๋๋ก ์
๋ฐ์ดํธํ๋ค (ํธ๋ฆฌ ๊น์ด๊ฐ ๊น์ด์ ธ๋ ํ๋ฒ์ parent๋ฅผ ์ฐพ์ ์ ์๊ฒ๋ ๊ฒฝ๋ก์ต์ ํ)
๋ ๋
ธ๋์ find()๊ฒฐ๊ณผ ๊ฐ์ด ๊ฐ์ผ๋ฉด ์ด๋ฏธ ํ ๊ทธ๋ฃน์ ์ํ๋ ๊ฒ์ด๋ฏ๋ก ์ด ๋ ๋
ธ๋์ ๊ฐ์ ์ ์๋ ๊ฒ์ ์ํ์ด ์๊ธฐ๋ ๊ฒ์ด๋ค
์ด๋ฅผ ํตํด ์ํ ์๋์ง ํ๋จ
๋
ธ๋ ๊ฐ์ : V, ๊ฐ์ ๊ฐ์ : E
E = V - 1์ผ ๋๋ง ์ ์๋ฏธํ ์ฐ์ฐํ๋ฏ๋ก E โ V
TC : O(V)
๋ฐ๋ณต๋ฌธ 2ํ, find ํจ์์ ์ฌ๊ท๋ ์ด๋ก ์ ์ผ๋ก ์์์ ์๋ ดํ๋ค๊ณ ํ๋ค
SC : O(V)
parent ๋ฐฐ์ด
*/
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
/**
* @param n: An integer
* @param edges: a list of undirected edges
* @return: true if it's a valid tree, or false
*/
vector<int> parent;
bool validTree(int n, vector<vector<int>> &edges) {
if (edges.size() != n - 1)
return false;
parent.resize(n);
for (int i = 0; i < n; i++)
parent[i] = i;
for (auto& edge : edges) {
int a = edge[0], b = edge[1];
int rootA = find(a), rootB = find(b);
if (rootA == rootB)
return false;
parent[rootA] = rootB;
}
}
int find(int x) {
if (parent[x] != x)
parent[x] = find(parent[x]);
return parent[x];
}
};