PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

백준 11724 연결 요소의 개수(c++)

SeungbeomKim 2022. 8. 4. 12:07

https://www.acmicpc.net/problem/11724

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주

www.acmicpc.net

<코드>

이 문제는 dfs, bfs의 기본 문제이다. 

#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <string>
#define max 1001

int board[max][max];
bool visited[max] = {0};
int cnt=0;
int n,m;


using namespace std;
//void dfs(int node)
//{
//	visited[node] = true;
//	for(int i=1;i<=n;i++)
//		if(!visited[i] && board[node][i]){
//			dfs(i);
//		}
//}
void bfs(int node)
{
	queue<int>q;
	visited[node] = true;
	q.push(node);
	while(!q.empty())
	{
		int cur = q.front();
		q.pop();
		for(int i=1;i<=n;i++)
		{
			if(!visited[i] && board[cur][i]==1)
			{
				visited[i] = true;
				q.push(i);
			}
		}
	}
}
int main()
{
	memset(board,0,sizeof(board));
	int u,v;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		cin>>u>>v;
		board[u][v] = board[v][u] = 1;
	}

	for(int i=1;i<=n;i++){
		if(!visited[i]){
			cnt++;
			//dfs(i);
			bfs(i);
		}
	}
	cout<<cnt;
	
}

<풀이과정>

방문여부가 false이고 간선이 존재하면 탐색을 진행하는 방향으로 알고리즘을 설계하였다.

dfs는 재귀적으로 해결하였고, bfs는 각 방문여부를 true로 바꿔주고 각 정점을 push하는 과정으로 해결하였다. 

'PS > 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]' 카테고리의 다른 글

백준 1012 유기농 배추(c++)  (0) 2022.08.05
백준 4963 섬의 개수(c++)  (0) 2022.08.04
백준 2606 바이러스(c++)  (0) 2022.08.03
백준 2178 미로 탐색(c++)  (0) 2022.08.03
BFS  (0) 2022.08.02