πŸ‘Š PS/Algorithm

[Baekjoon] 1043번: 거짓말

hades1 2024. 8. 1. 20:45

πŸ₯… 문제

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

 

πŸ” 섀계

νŒŒν‹°μ— μ΅œμ’…μ μœΌλ‘œ 진싀을 μ•Œκ²Œ λ˜λŠ” μ‚¬λžŒμ΄ ν•œ λͺ…이라도 있으면, 거짓말을 ν•  수 μ—†λ‹€.

 

νŒŒν‹°μ— 진싀을 μ•„λŠ” μ‚¬λžŒμ„ λ¨Όμ € μ°Ύκ³ , 있으면 νŒŒν‹°μ— μžˆλŠ” μ‚¬λžŒλ“€μ„ 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ˜ μ§‘ν•©μœΌλ‘œ union ν•˜λ €κ³  ν–ˆλŠ”λ°, 이 방법은 νŒŒν‹° 쀑 뒀에 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ 있으면, μ•žμ— νŒŒν‹°μ—μ„œλŠ” 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ˜ μ§‘ν•©μœΌλ‘œ unionν•  수 μ—†λ‹€.

 

λ‹¨μˆœν•˜κ²Œ νŒŒν‹°μ— μžˆλŠ” μ‚¬λžŒλ“€μ„ 묢기만 ν•˜λ©΄, 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ λ’€μͺ½ νŒŒν‹°μ— λ‚˜μ™€λ„ λ’€μͺ½ νŒŒν‹°μ—μ„œ 진싀을 μ•„λŠ” μ‚¬λžŒλ“€μ˜ μ§‘ν•©μœΌλ‘œ 반영되기 λ•Œλ¬Έμ—, νŒŒν‹° κ°κ°μ—μ„œ 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ μ—†μœΌλ©΄ 총 νŒŒν‹° μˆ˜μ—μ„œ κ°μ†Œμ‹œν‚€κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

 

πŸ‘Š 풀이

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m, number, person, result = 0;
vector<int> parent(51);
vector<vector<int>> parties;

int find_parent(int x) {
	if (parent[x] != x) {
		return find_parent(parent[x]);
	}
	return x;
}

void union_parent(int a, int b) {
	a = find_parent(a);
	b = find_parent(b);
	if (a < b) {
		parent[b] = a;
	}
	else {
		parent[a] = b;
	}
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;

	for (int i = 1; i <= n; i++) {
		parent[i] = i;
	}

	cin >> number;
	if (number == 0) {
		cout << m << "\n";
		return 0;
	}

	for (int i = 0; i < number; i++) {
		cin >> person;
		parent[person] = 0;
	}
	
	for (int i = 0; i < m; i++) {
		vector<int> party;
		cin >> number;
		for (int j = 0; j < number; j++) {
			cin >> person;
			party.push_back(person);
		}
		for (int j = 1; j < number; j++) {
			union_parent(party[0], party[j]);
		}
		parties.push_back(party);
	}

	int result = m;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < parties[i].size(); j++) {
			if (find_parent(parties[i][j]) == 0) {
				result -= 1;
				break;
			}
		}
	}
	cout << result << "\n";

	return 0;
}