홍시홍의 프로그래밍

[백준 1976] 여행 가자 본문

알고리즘 문제풀이/백준

[백준 1976] 여행 가자

홍시홍 2020. 1. 2. 23:44

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

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인지 알아보자. 물론 중간에 다른 도시를 경유해서 여행을 할 수도 있다. 예를 들어 도시가 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, 동혁이의 여행 계획이 E C B C D 라면 E-A-B-C-B-C-B-D라는 여행경로를 통해 목적을 달성할

www.acmicpc.net

요구 사항

1. Union-Find 구현

 

풀이

1. 여행 경로가 주어졌을 때, 모든 여행지의 대표값이 동일한지 확인

 

#include <iostream>

using namespace std;

int parent[1000001];
int map[1001][1001];
int n, m;
int p[1001];
int Find(int x)
{
	if (parent[x] == x)
		return x;
	else
		return parent[x] = Find(parent[x]);
}
void Union(int x, int y)
{
	x = Find(x);
	y = Find(y);
	if (x != y)
	{
		if (x < y)
			parent[y] = x;
		else
			parent[x] = y;
	}

}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> n >> m;
	int x, y, z;
	for (int i = 0; i <= n; i++)
		parent[i] = i;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == 1)
				Union(i, j);
		}
	}
	for (int i = 0; i < m; i++)
	{
		cin >> p[i];
	}

	for (int i = 0; i < m - 1; i++)
	{
		if (Find(p[i]) != Find(p[i + 1]))
		{
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2805] 나무 자르기  (0) 2020.01.08
[백준 1920] 수 찾기 (해시, 정렬)  (2) 2020.01.08
[백준 1717] 집합의 표현  (0) 2020.01.02
[백준 1021]회전하는 큐  (0) 2019.12.19
[백준 1427] 소트인사이드  (0) 2019.12.19
Comments