-
[BOJ]백준 1043번: 거짓말(C++)/DisjointSetProblem Solving/BOJ(백준) 2021. 6. 10. 10:54
https://www.acmicpc.net/problem/1043
오랜만에 disjoint set 문제
파티에 참석한 인원들을 전부 union해준 뒤 진실을 알고 있는 사람과 같은 parent를 가진 팀으로만 이루어져 있는지 체크해주었다
#include <cstdio> #include <vector> using namespace std; typedef struct disjointSet { vector<int> parent, rank; disjointSet(int n) { rank = vector<int>(n + 1); for (int i = 0; i <= n; i++) parent.push_back(i); } int find(int x) { if (parent[x] == x)return x; else return parent[x] = find(parent[x]); } void unionSet(int x, int y) { x = find(x); y = find(y); int temp; if (x == y)return; if (rank[x] > rank[y]) { temp = x; x = y; y = temp; } parent[x] = y; if (rank[x] == rank[y])++rank[y]; } }disjointSet; int n, m, k, ans; vector<int> v; vector<vector<int>> party; int main() { scanf("%d%d", &n, &m); scanf("%d", &k); for (int i = 0,num; i < k; i++) { scanf("%d", &num); v.push_back(num); } disjointSet ds(n); for (int t = 0,a,b; t < m; t++) { scanf("%d", &a); party.push_back(vector<int>(a)); for (int i = 0; i < a; i++) scanf("%d", &party.back()[i]); for (int i = 0; i < party.back().size(); i++) for (int j = i + 1; j < party.back().size(); j++) ds.unionSet(party.back()[i], party.back()[j]); } for (auto p : party) { bool b = true; for (auto y : p) for (auto x : v) if (ds.find(x) == ds.find(y))b = false; if (b)ans++; } printf("%d", ans); return 0; }
'Problem Solving > BOJ(백준)' 카테고리의 다른 글
[BOJ]백준 7682번: 틱택토(C++)/BackTracking (0) 2021.06.13 [BOJ]백준 21776번: 가희와 읽기 쓰기 놀이(Python) (418) 2021.06.13 [BOJ]백준 21772번: 가희의 고구마 먹방(C++)/BackTracking (798) 2021.06.08 [BOJ]백준 21738번: 얼음깨기 펭귄(C++)/BFS (863) 2021.06.07 [BOJ]백준 17245번: 서버실(C++)/Binary Search (830) 2021.06.07