11724번. 연결 요소의 개수

phoenixKim·2023년 11월 18일
0

백준 알고리즘

목록 보기
139/174

전략

  • 문제를 보면, 방향성이 없다고 함.

  • 예제 입력 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;
}



profile
🔥🔥🔥

0개의 댓글

관련 채용 정보