Baekjoon Review

[Gold 4] 1043번 거짓말

hanseongbugi 2023. 11. 27. 15:43

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

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

이 문제는 그래프 순회 문제이다.

DFS를 통해 해결해야한다. 이미 지나간 파티에서도 거짓말을 못하는 파티를 검사해야하기 때문이다.

 

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

int N,M;
int visited[51];
int party[51][51];
int graph[51][51];
vector<int> truePerson;


void searchGraph(int p) {
	visited[p] = 1;
	
	for (int i = 1; i <= N; i++) {
		if (!graph[p][i])continue;
		
		if (visited[i]) continue;

		searchGraph(i);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> N >> M;

	int trueNum;
	int num;
	cin >> trueNum;
	for (int i = 0; i < trueNum; i++) {
		cin >> num;
		truePerson.push_back(num);
	}
	for (int i = 0; i < M; i++) {
		cin >> num;
		int center;
		cin >> center;
		party[i][0] = center;
		for (int j = 1; j < num; j++) {
			cin >> party[i][j];
			graph[center][party[i][j]] = 1;
			graph[party[i][j]][center] = 1;
		}
	}
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < truePerson.size(); k++) {
				if (party[i][j] == truePerson[k]) {
					searchGraph(party[i][j]);
				}
			}
		}
	}

	int result = 0;
	for (int i = 0; i < M; i++) {
		bool counter = true;
		for (int j = 0; j < N; j++) {
			if (!party[i][j]) continue;

			int np = party[i][j];
			if (visited[np]) {
				counter = false;
				break;
			}
		}
		if (counter) result += 1;
	}
	cout << result << '\n';
	
}