본문 바로가기

하루하나코딩

백준 1043 : 거짓말 c++

코드

#include <iostream>
#include <string.h>

using namespace std;

int getParent(int parent[], int x){
	if(parent[x] == x) return x;
	return parent[x] = getParent(parent, parent[x]);
}

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

bool findParent(int parent[], int a, int b){
	a = getParent(parent, a);
	b = getParent(parent, b);
	if(a == b) return true;
	return false;
}

int partyp[51][52];

int main(){
	
	int N, M;
	cin >> N >> M;
	
	bool partypeople[51];
	int man[51];
	memset(partypeople, false, (N+1)*sizeof(bool));
	
	for(int i = 0; i <= N; i++){
		man[i] = i;
	}
	
	int knp;
	cin >> knp;
	
	int knpeople[51];
	
	for(int i = 0; i < knp; i++){
		cin >> knpeople[i];
		partypeople[knpeople[i]] = true;
	}
	
	for(int i = 1; i < knp; i++){
		unionParent(man, knpeople[i], knpeople[i-1]);
	}
	
	
	
	for(int i = 0; i < M; i++){
		int p;
		cin >> p;
		
		for(int j = 0; j < p; j++){
			cin >> partyp[i][j];
		}
		for(int j = 1; j < p; j++){
			unionParent(man, partyp[i][j], partyp[i][j-1]);
		}
	}
	
	int answer = M;

	
	for(int i = 0; i <= N; i++){
		for(int j = 0; j < knp; j++){
			if(findParent(man, knpeople[j], i)){
				partypeople[i] = true;
			}
		}
	}
	
	for(int i = 0; i < M; i++){
		int j = 0;
		while(partyp[i][j] != 0){
			if(partypeople[partyp[i][j]] == true){
				answer--;
				break;
			}
			j++;
		}
	}
	
	cout << answer;
	
	return 0;
}

첨에 구현으로 풀었는데,, 틀렸다.

처음파티나 나중파티나 상관이 없다는 점이 중요하다

그래서 노드로 다 묶은다음에

know가 있으면 M에서 빼줬다.

 

그 동빈나씨가 unionParent를 int로 해놨어서 나도 int로햇는데

런타임오류가 나서 질문했는데 저걸 void로 해야 안난다더라..

 

끗..

'하루하나코딩' 카테고리의 다른 글

백준 1167 : 트리의 지름 c++  (0) 2023.04.14
백준 1149 : RGB거리 c++  (1) 2023.04.14
백준 1927 : 최소 힙 c++  (0) 2023.04.12
백준 11279 : 최대 힙 c++  (0) 2023.04.12
백준 14500 : 테트로미노 c++  (0) 2023.04.12