๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๋ชจ๋ฅธ๋ค. ๊ธ์ ๋ดค๋๋ฐ ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ๋ค์ด ์์ด์ ๋์ ๋ฉํ ๊ด๋ฆฌ๋ฅผ ์ํด ์ผ๋จ ์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํ ์ง์๋ค๊น์ง๋ง ์ดํดํ๋ค.
์ผ๋จ 1๋ฒ์ ์ปดํจํฐ๊ฐ ๋ฐ์ด๋ฌ์ค์ ๊ฐ์ผ๋๋ค๊ณ ํ์ ๋, ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ผ๋์ด์ ์ด ๋ช ๋์ ์ปดํจํฐ๊ฐ ๊ฐ์ผ๋๋ ์ง ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ ์ ๋ก
์ด๋ฐ ๊ทธ๋ฆผ์ด ๋จธ๋ฆฌ์ ๊ทธ๋ ค์ง๋ค.
1) ๊ทธ๋ํ๋ ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค
2) ํด๋น ๋ฌธ์ ๋ ๋ฐฉํฅ์ฑ์ด ์๋ค.
๋ผ๋ ์ฌ์ค์ ์ผ๋จ ์์๋ธ๋ค.
์ด์ ์ธ์ ํ๋ ฌ๋ก ์๊ฐํ ์ง ์ธ์ ๋ฆฌ์คํธ๋ก ์๊ฐํ ์ง ์ ํด์ผ ํ๋ค.
์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ๋๋ก ์ถ์ฒํ๋ ๊ฒฝ์ฐ๋ : ๊ฐ์ ์ด ์ ์ ^2์ ๊ฐ๊น์ธ ๋์ด๋ค.
์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋๋ก ์ถ์ฒํ๋ ๊ฒฝ์ฐ๋ ์์ ๋ฐ๋์ด๋ค.
๋ฌธ์ ์์ ์ ์ ์ 100๊น์ง ์ฌ ์ ์๊ณ ๊ฐ์ ์ ๋ฐ๋ก ๋ด์ฉ์ด ์ฃผ์ด์ง์ง ์์๋ค.
๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด ๋ณด๋๋ก ํ๊ฒ ๋ค. ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ์ ์ ์ด ์ธ์ ๋์ด ์๋ ์ ์ ์ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด
1) 2, 5
2) 1, 3, 5
3) 2
4) 7
5) 1, 2, 6
6) 5
7) 4
์ด๋ค. ์ฃผ์ด์ง ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ดํ์๋ค.
1๋ฒ์ 2๋ฒ 5๋ฒ๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค.
๊ทธ๋ผ ์ฐ์ ์ ์ผ๋ก 2๋ฒ์ ๋ค์ด๊ฐ๋ค. 2๋ฒ์ ๋ค์ 1, 3, 5์ ์ฐ๊ฒฐ๋์ด ์๋ค. 1์ ํฌํจํ์ง ์๋๋ค. 3๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ค.
3์ผ๋ก ๋ค์ด๊ฐ๋ค. 3์ 2์ ์ฐ๊ฒฐ๋์ด ์๋ค. 2๋ ์ด๋ฏธ countํ์๊ธฐ ๋๋ฌธ์ ์ธ์ง ์๋๋ค. 3์ด ๋๋๋ค.
๋ค์ 2๋ก ๋์๊ฐ๋ค. ๊ทธ ๋ค์์ 5์ด๋ค.
5๋ก ๋ค์ด๊ฐ๋ค 1, 2 ๋ชจ๋ ์ด๋ฏธ count๋์๊ธฐ ๋๋ฌธ์ ์ธ์ง ์๋๋ค. 6์ผ๋ก ๋์ด๊ฐ๋ค
6์ผ๋ก ๋ค์ด์๋ค. 5๋ ์ด๋ฏธ ์ธ์๋ค ๋์๊ฐ๋ค
5๋ก ๋์์๋ค. ๋ค์ 2๋ก ๋์๊ฐ๋ค.
2๋ก ๋์์๋ค ๋ค์ 1๋ก ๋์๊ฐ๋ค
...
์ฌ๊ท๊ฐ ๋ฐ๋ณต๋๋ค.
์ด๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ์ด ๋์ฌ ๊ฒ์ด๋ค.
์ด๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด O(ve)์ธ ๊ฒ ๊ฐ๋ค
#include <bits/stdc++.h>
using namespace std;
int cnt;
int visited[101];
vector<int> vec[101];
void round(int n)
{
cnt++;
visited[n] = 1;
for (int i = 0; i < vec[n].size(); i++)
{
if (!visited[vec[n][i]])
round(vec[n][i]);
}
}
int main(void)
{
cin.tie(0);
ios::sync_with_stdio(0);
int v, e;
cin >> v >> e;
vec->resize(v + 1);
while (e--)
{
int num1, num2;
cin >> num1 >> num2;
vec[num1].push_back(num2);
vec[num2].push_back(num1);
}
round(1);
cout << cnt - 1;
return (0);
}