문제를 보면, 방향성이 없다고 함.
예제 입력 1, 2 번을 보면, 인접한 정점에 대하여 깊이 있게 들어가고, 외부 탐색 시 , 즉 for( 모든 정점 에 대하여 탐색)
할 때 카운팅을 하고, dfs 에서는 방문 체크를 하면 될 것 같다는
전략을 세움.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#include <map>
#include <string>
int a, b;
void dfs(int n , vector<vector<int>>&v1
, vector<bool>& v2)
{
if (v2[n] == false)
{
v2[n] = true;
}
else
return;
for (int i = 0; i < v1[n].size(); ++i)
{
dfs(v1[n][i], v1, v2);
}
}
int main()
{
// 입력값.
// [1] = 2
// [2] = 3 4 5
// [3] = 4
// [4] = 6
// [5] = 1
// [6] =
// 방향성 없이 인접하게 만들기.
// [1] = 2 5
// [2] = 1 3 4 5
// [3] = 2 4
// [4] = 2 3 6
// [5] = 1 2
// [6] = 4
//===============================
// [1] = 2
// [2] = 5
// [3] = 4
// [4] = 6
// [5] = 1
// [6] =
// [1] = 2 5
// [2] = 1 5
// [3] = 4
// [4] = 3 6
// [5] = 1 2
// [6] = 4
// 시작할 때 타겟 정점으로 돌릴 수 있다면 카운팅
// 못 돌리면 카운팅 안함.
cin >> a >> b;
vector<vector<int>> v(a + 1);
int x, y;
for (int i = 0; i < b; ++i)
{
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
// 재귀 돌리면서 인접한 정점 계속 들어가자.
// 방문 했는지를 체크하면서
int cnt = 0;
vector<bool> check(a + 1 , false);
for (int i = 1; i <= a; ++i)
{
if (check[i] == false)
{
++cnt;
}
dfs(i, v, check);
}
cout << cnt;
}