알고리즘&자료구조/문제

[BOJ] 1976 여행 가자 C++

Nakuri 2023. 2. 24. 05:49
728x90

개요

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

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

골드4 난이도 문제다.

풀이

노드간 연결 여부를 확인하는 문제다.

BFS를 통해 풀 수도 있겠지만 이번에는 유니온 파인드(disjoint-set)를 이용했다.

같은 경로의 경우 같은 루트 노드를 갖고 있으므로 이를 비교하면 된다.

기본적인 유니온 파인드로 구현이 가능했다.

코드

#include<iostream>
#include<algorithm>
using namespace std;
constexpr int N_LIMIT = 202;

int parent[N_LIMIT];
int N, M;

void Init(int n)
{
	for (int i = 1; i <= n; i++)
		parent[i] = i;
}
int Find(int n)
{
	if (parent[n] == n) return n;

	return parent[n] = Find(parent[n]);
}
void Union(int a, int b)
{
	a = Find(a);
	b = Find(b);

	if (a == b) return;
	parent[a] = b;
}
void Solution()
{
	cin >> N >> M;
	Init(N);

	int num;
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			cin >> num;
			if (num) Union(i, j);
		}
	}

	cin >> num;
	int root = Find(num);
	for (int i = 2; i <= M; i++)
	{
		cin >> num;
		if (root != Find(num))
		{
			cout << "NO";
			return;
		}
	}
	cout << "YES";
}

int main()
{
	cin.tie(0)->sync_with_stdio(0);

	Solution();
}

'알고리즘&자료구조 > 문제' 카테고리의 다른 글

[BOJ] 5972 택배 배송 C++  (0) 2023.03.06
[BOJ] 1043 거짓말 C++  (1) 2023.02.24
[BOJ] 4195 친구 네트워크 C++  (0) 2023.02.23
[BOJ] 1717 집합의 표현 C++  (0) 2023.02.23
[BOJ] 3190 뱀 C++  (0) 2023.02.23