1 분 소요

소셜 네트워킹 어플리케이션 (백준 Gold 5)

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

특정한 친구 수 N 과
친구 관계에 대한 설명이 k개 주어졌을 때
두 사람이 친구인지 묻는 M개의 질문에 답하는 문제

  • 친구라면 1, 아니라면 0을 출력

풀이 방법

분리 집합 문제로서
N개의 Parent Vector를 만들고
K개에 대하여 서로 Union 해준 후
M개의 쌍에 대하여 서로 ‘같은 부모’를 가지는 지
검사하면 풀 수 있다!

제출 코드

#include<iostream>
#include<vector>

using namespace std;

int FindParent(vector<int>& pv, int x)
{
	if (pv[x] == x)
		return x;

	return pv[x] = FindParent(pv, pv[x]);
}

bool Union(vector<int>& pv, int a, int b)
{
	a = FindParent(pv, a);
	b = FindParent(pv, b);

	if (a == b)
		return false;	

	pv[a] = b;

	return true;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	int t;
	cin >> t;
	int idx = 1;
	while (idx <= t)
	{
		int n, k;
		cin >> n >> k;

		vector<int> pv(n);
		for (int i = 0; i < n; i++)
			pv[i] = i;

		for (int i = 0; i < k; i++)
		{
			int a, b;
			cin >> a >> b;
			Union(pv, a, b);
		}

		int m;
		cin >> m;

		cout << "Scenario " << idx << ":" << '\n';
		for (int i = 0; i < m; i++)
		{
			int a, b;
			cin >> a >> b;
			if (FindParent(pv, a) == FindParent(pv, b))
			{
				cout << 1 << '\n';
			}
			else
			{
				cout << 0 << '\n';
			}
		}

		cout << '\n';

		idx++;
	}

	return 0;
}

결과

Image

시간 초과인 부분은
아래의 입력 부분에 대한 처리를 빠트려서 발생하였다

ios_base::sync_with_stdio(false);
cin.tie(nullptr);

댓글남기기