[baekjoon/C++] ๋ฐฑ์ค 1043_๊ฑฐ์ง๋ง
๋ฐฑ์ค 1043
๋์ด๋ ; Gold 4
๋ฌธ์ ๋งํฌ ; https://www.acmicpc.net/problem/1043
1043๋ฒ: ๊ฑฐ์ง๋ง
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ
www.acmicpc.net
ํ์ด/์ฌ๊ณ ๊ณผ์
์ง๋ฏผ์ด๊ฐ ์ง์ค์ ์๋ ์ฌ๋๋ค์ ํผํด ํํฐ ์ฌ๋๋ค์๊ฒ ๊ฑฐ์ง๋ง์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฌธ์ .
๋ฌธ์ ํด๊ฒฐ์ ์ค์ํ ๋ถ๋ถ์ "์ด๋ค ์ฌ๋์ด ์ด๋ค ํํฐ์์๋ ์ง์ค์ ๋ฃ๊ณ ,
๋ ๋ค๋ฅธ ํํฐ์์๋ ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์์ ๋๋ ์ง๋ฏผ์ด๋ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง๊ฒ ๋๋ค."์๋ค.
ํํฐ์ ์ง์ค์ ์๋ ์ฌ๋์ด ์๋ค๋ฉด, ๊ทธ ํํฐ์ ์๋ ๋ชจ๋ ์ฌ๋์ด ์ฐธ์ํ๋ ๋ค๋ฅธ ํํฐ์์๋ ์ง๋ฏผ์ด๋ ์ง์ค๋ง ๋งํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๊ฐ ํํฐ์ ์ฐธ์ํ ์ฌ๋๋ค์ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ณ , ์ง์ค์ ์๋ ์ฌ๋๊ณผ ๊ฐ์ ๊ทธ๋ฃน์ด๋ผ๋ฉด
์ง๋ฏผ์ด๊ฐ ๊ฑฐ์ง๋ง์ ํ ์ ์๋ค๋ ์ ์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ฒ์์ ๊ทธ๋ํ๊ฐ ๋ ์ค๋ฅด๊ธด ํ์ง๋ง, ์๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ๋ค ์ค์์๋ ๋ง๋ ํ ์ด๊ฑฐ ์จ์ผ๊ฒ ๋ค ํ๋ ๊ฒ ์์ด์ ๊ตฌ๊ธ๋ง์ ํด๋ดค๋ค.
ํธ๋ฆฌ&๊ทธ๋ํ ๋ถ๋ถ ์ง๋ ๋๊ฐ๋ ์ค์ผ ๋ ์๋ฃ๊ตฌ์กฐ ์ฌ์๊ฐํ๋ ค๊ณ ๋ง์๋จน๊ณ ๊ณต๋ถ ์ ํ๋๋ ๋ฐฑ์ค ๋ฌธ์ ํ ๋ ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์์ ์ผ๋ฅธ ํผ์์๋ผ๋ ๋ค์ ๊ณต๋ถํด์ผ ํ ๊ฒ ๊ฐ๋ค.ใ
์ด ๋ฌธ์ ์์๋ Union-Find ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋ค.
์ฐ์ , ์ง์ค์ ์๋ ์ฌ๋๋ค์ ์ ๋ ฅ๋ฐ์ ๋ฒกํฐ์ ์ ์ฅํ๋ค.
๊ทธ๋ค์์๋ ๊ฐ ํํฐ์ ์ฐธ์ํ๋ ์ฌ๋๋ค์ ๊ฐ์ ๊ทธ๋ํ๋ก ๋ฌถ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํํฐ์ ์จ ์ฌ๋๋ค๊ณผ ์ง์ค์ ์๋ ์ฌ๋์ด ๊ฐ์ ๊ทธ๋ํ์ ์ํด์๋ค๋ฉด(๊ฐ์ root ๋ ธ๋๋ผ๋ฉด),
๊ฑฐ์ง๋ง์ ํ ์ ์๋ ํํฐ์ ์(M)๋ฅผ ์ค์ธ๋ค.
์ฝ๋
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
63
64
65
66
67
68
69
70
71
72
73
|
#include <iostream>
#include <vector>
using namespace std;
int parents[51];
vector <int> know;
vector <vector<int>> party(50);
int Find(int x) {
if (parents[x] == x) return x; //x์ ๋ถ๋ชจ๊ฐ x์ ๊ฐ์ ๊ฒฝ์ฐ, ์๊ธฐ ์์ return
return x = Find(parents[x]); //๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฃจํธ ๋
ธ๋๋ฅผ ์ฐพ์ ๋๊น์ง ์ฌ๊ท์ ์ผ๋ก ํ์
}
void Union(int a, int b) {
a = Find(a);
b = Find(b);
parents[a] = b;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, M, K;
cin >> N >> M >> K; //K = ์ง์ค์ ์๋ ์ฌ๋์ ์
while (K--) {
int truth; //์ง์ค์ ์๋ ์ฌ๋์ ๋ฒํธ
cin >> truth;
know.push_back(truth); //์ง์ค์ ์๋ ์ฌ๋์ ๋ฒํธ๋ฅผ know ๋ฒกํฐ์ push
}
for (int i = 1; i <= N; i++) { //๋ชจ๋ ๋
ธ๋๊ฐ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋๋ก ์ด๊ธฐํ
parents[i] = i;
}
for (int i = 0; i < M; i++) {
int num, prev, member;
cin >> num; //ํํฐ์ ์ค๋ ์ฌ๋ ์
for (int j = 0; j < num; j++) {
if (j < 1) {
cin >> member;
}
else {
prev = member;
cin >> member;
Union(prev, member); //ํํฐ์ ์จ ์ฌ๋ ๊ทธ๋ฃนํํ๊ธฐ
}
party[i].push_back(member); //i๋ฒ์งธ ํํฐ์ ์จ ์ฌ๋๋ค์ ๊ทธ๋ฃน์ผ๋ก ์ ์ฅ
}
}
for (auto& list : party) {
bool flag = false;
for (auto& person : list) { //ํํฐ์ ๊ฐ ์ฌ๋๋ค
if (flag) break;
for (auto& truth : know) { //์ง์ค์ ์๋ ์ฌ๋๋ค
if (Find(person) == Find(truth)) { //ํํฐ์ ๊ฐ ์ฌ๋์ด ์ง์ค์ ์๋ ์ฌ๋๊ณผ ๊ฐ์ ๋ฃจํธ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด
flag = true; //flag๋ truth
break;
}
}
}
if (flag) M--; //flag๊ฐ truth์ธ ๊ฒฝ์ฐ ๊ฑฐ์ง๋ง์ ํ ์ ์๋ ํํฐ ์ ํ๋ ๊ฐ์
}
cout << M;
return 0;
}
|
cs |
์ง์ /๋๊ธ ์ธ์ ๋ ํ์