코드
#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 |