https://www.acmicpc.net/problem/1043
1043번: 거짓말
지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게
www.acmicpc.net
UF문제이다. 나는 파티에 거짓말 아는 친구가 있으면 -1로 부모값을 바꿔 계산해주었다.
#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define INF 2e9
#define F first
#define S second
using namespace std;
typedef long long l;
typedef pair<int,int> p;
typedef tuple<int,int,int> tu;
typedef vector<int> vc;
unordered_map<int,int> root;
bool check[51];
int Find(int x){
if(root[x] == x) return x;
else return root[x] = Find(root[x]);
}
void Union(int x,int y){
x = Find(x), y = Find(y);
if(x == y) return;
if(x < y) root[y] = x;
else root[x] = y;
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int n,m,k,a;
cin >> n >> m >> k;
for(int i=1;i<=n;i++)
root[i] = i;
vc save[51];
for(int i=0;i<k;i++){
cin >> a;
check[a] = true;
root[a] = -1;
}
root[-1] = -1;
for(int z=0;z<m;z++){
cin >> k;
for(int i=0;i<k;i++){
cin >> a;
if(check[a]) save[z].push_back(-1);
else save[z].push_back(a);
}
int size = int(save[z].size());
for(int i=0;i<size-1;i++)
Union(save[z][i],save[z][i+1]);
}
int temp = m;
for(int i=0;i<temp;i++)
if(Find(save[i][0]) == -1) m--;
cout << m;
}
'baekjoon' 카테고리의 다른 글
1261번 알고스팟 (0) | 2022.04.24 |
---|---|
3197번 백조의 호수 (0) | 2022.04.21 |
1395번 스위치 (0) | 2022.04.17 |
3078번 좋은 친구 (0) | 2022.04.16 |
16496번 큰 수 만들기 (0) | 2022.04.15 |