🙇‍♀️친구인가? (Union&Find 자료구조)

오늘은 새 학기 새로운 반에서 처음 시작하는 날이다.

현수네 반 학생은 N명이다.

현수는 각 학생들의 친구관계를 알고 싶다.

모든 학생은 1부터 N까지 번호가 부여되어 있고, 현수에게는 각각 두 명의 학생은 친구 관계가 번호로 표현된 숫자쌍이 주어진다.

만약 (1, 2), (2, 3), (3, 4)의 숫자쌍이 주어지면 1번 학생과 2번 학생이 친구이고, 2번 학생과 3번 학생이 친구, 3번 학생과 4번 학생이 친구이다.

그리고 1번 학생과 4번 학생은 2번과 3번을 통해서 친구관계가 된다.

학생의 친구관계를 나타내는 숫자쌍이 주어지면 특정 두 명이 친구인지를 판별하는 프로그램을 작성하세요.

두 학생이 친구이면 “YES”이고, 아니면 ”NO”를 출력한다.

▣ 입력설명
첫 번째 줄에 반 학생수인 자연수 N(1<=N<=1,000)과 숫자쌍의 개수인 M(1<=M<=3,000)이 주어지고, 다음 M개의 줄에 걸쳐 숫자쌍이 주어진다. 

마지막 줄에는 두 학생이 친구인지 확인하는 숫자쌍이 주어진다.

▣ 출력설명
첫 번째 줄에 “YES"또는 "NO"를 출력한다.

▣ 입력예제 1 
9 7
1 2
2 3
3 4
4 5
6 7
7 8
8 9
3 8

▣ 출력예제 1
NO

🚀풀이

친구쌍을 그래프로 만들어서 BFS로 풀었다.

int n, m, a, b;
vector<vector<int>> board;
vector<int> discovered;
bool flag = false;
void setting()
{
	cin >> n >> m;
	board = vector<vector<int>>(n + 1, vector<int>(n + 1));
	discovered = vector<int>(n + 1);
	for (int i = 0; i < m; ++i)
	{
		cin >> a >> b;
		board[a][b] = 1;
		board[b][a] = 1;
	}

	cin >> a >> b;
	// a -> b까지 그래프가 연결되어 있는가?
}

void BFS(int here)
{
	queue<int> q;
	q.push(here);

	while (q.empty() == false)
	{
		int here = q.front();
		if (here == b)
		{
			cout << "YES" << '\n';
			flag = true;
			return;
		}
		q.pop();

		for (int there = 0; there < n; ++there)
		{
			if (board[here][there] == 0)
				continue;
			if (discovered[there])
				continue;

			q.push(there);
			discovered[there] = 1;
		}
	}
	
}

Union&Find 자료구조를 몰라서 BFS로 했는데 그냥 풀렸다.

문제 풀이는 이걸로하고 Union&Find는 알고리즘으로 따로 기록해야지.

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int n, m, a, b;
vector<vector<int>> board;
vector<int> discovered;
bool flag = false;
void setting()
{
	cin >> n >> m;
	board = vector<vector<int>>(n + 1, vector<int>(n + 1));
	discovered = vector<int>(n + 1);
	for (int i = 0; i < m; ++i)
	{
		cin >> a >> b;
		board[a][b] = 1;
		board[b][a] = 1;
	}

	cin >> a >> b;
	// a -> b까지 그래프가 연결되어 있는가?
}

void BFS(int here)
{
	queue<int> q;
	q.push(here);

	while (q.empty() == false)
	{
		int here = q.front();
		if (here == b)
		{
			cout << "YES" << '\n';
			flag = true;
			return;
		}
		q.pop();

		for (int there = 0; there < n; ++there)
		{
			if (board[here][there] == 0)
				continue;
			if (discovered[there])
				continue;

			q.push(there);
			discovered[there] = 1;
		}
	}
	
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	setting();
	BFS(a);
	if (flag == false)
		cout << "NO" << '\n';

	return 0;
}