BOJ
C++ [BOJ] 백준 7511번 소셜 네트워킹 어플리케이션
coco_ball
2022. 5. 13. 14:00
https://www.acmicpc.net/problem/7511
7511번: 소셜 네트워킹 어플리케이션
각 테스트 케이스마다 "Scenario i:"를 출력한다. i는 테스트 케이스 번호이며, 1부터 시작한다. 그 다음, 각각의 쌍마다 두 사람을 연결하는 경로가 있으면 1, 없으면 0을 출력한다. 각 테스트 케이스
www.acmicpc.net
SOLUTION
union-find를 활용하는 기본문제.
배열을 이용하여 각 정점의 부모를 찾아 부모가 같으면 두 사람을 연결하는 경로가 있고, 다르면 없음
코드
#include <iostream>
using namespace std;
int arr[1000001];
int findParent(int idx) {
if (arr[idx] == idx) return idx;
return arr[idx] = findParent(arr[idx]);
}
void merge(int a, int b) {
int na = findParent(a);
int nb = findParent(b);
if (na < nb) arr[nb] = na;
else arr[na] = nb;
}
void check(int a, int b) {
int na = findParent(a);
int nb = findParent(b);
if (na == nb) {
cout << 1 << '\n';
return;
}
cout << 0 << '\n';
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int tc;
cin >> tc;
for(int i=0;i<tc;i++) {
int n, k;
cin >> n >> k;
for (int j = 0;j < n;j++) {
arr[j] = j;
}
for (int j = 0;j < k;j++) {
int x, y;
cin >> x >> y;
merge(x, y);
}
cout << "Scenario " << i + 1 << ":\n";
int m;
cin >> m;
for (int j = 0;j < m;j++) {
int x, y;
cin >> x >> y;
check(x, y);
}
cout << '\n';
}
}