백준/탐색

[백준]C++ 11742(연결 요소의 개수)

2zreal 2024. 6. 27. 17:12
#include <iostream>
#include <vector>

using namespace std;

vector<int> v[1001];
int visited[1001];

void DFS(int a);

int main(void)
{
	int a=0;
	int b=0;
	
	cin>>a>>b;
	
	for(int i=0; i<b; i++)
	{
		int num1=0;
		int num2=0;
		cin>>num1>>num2;
		
		v[num1].push_back(num2);
		v[num2].push_back(num1);
	}
	
	int count=0;
	
	for(int i=1; i<=a; i++)
	{
		if(visited[i]==0)
		{
			visited[i]=1;
			DFS(i);
			count++;
		}
		
	}
	
	cout<<count;
	
	
	return 0;
}

void DFS(int a)
{
	for(int i=0; i<v[a].size(); i++)
	{
		if(visited[v[a][i]]==0)
		{
			visited[v[a][i]]=1;
			DFS(v[a][i]);
		}
	}
}

 

이 문제는 처음에 연결 요소의 개수? 이게 무슨말인지 싶었다.

이거만 이해하면 풀기는 어렵지 않다.

나는 이 문제를 DFS로 풀었다.

처음에 1부터 시작해서 깊게 탐색을 한다. 1과 연결된 부분은 모두 방문처리하고, 방문처리가 된 정점은 다시 방문하지 않는다.

for(int i=1; i<=a; i++)
{
if(visited[i]==0)
{
visited[i]=1;
DFS(i);
count++;
}
}

이 부분에서 이미 방문된 정점이면 방문하지 않는다. 이게 연결 요소의 개수를 찾는 핵심이다.