본문 바로가기

백준

7511 소셜 네트워킹 어플리케이션

유니온 파인드로 쉽게 풀 수 있는 문제

유파 예제 문제 같다

 

- union find: https://burningjeong.tistory.com/196

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#include<cassert>
#include <climits>
#include <tuple>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
#define MAXV 987654321
#define FOR(i, n) for(int i = 0; i < (n); ++i)

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

vector<int> parent;

void    init(int n)
{
    parent.resize(n + 1);

    for (int i = 0; i <= n; i++)
        parent[i] = i;
}

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

void    merge(int x, int y)
{
    x = find(x);
    y = find(y);
    
    parent[x] = y;
}

void solve() {
    int n, k;
    scanf("%d %d", &n, &k);
    
    init(n);
    
    FOR(i, k) {
        int a, b;
        scanf("%d %d", &a, &b);
        merge(a, b);
    }
    
    int m;
    scanf("%d", &m);
    FOR(i, m) {
        int a, b;
        scanf("%d %d", &a, &b);
        
        if (find(a) == find(b)) {
            printf("1\n");
        }
        else {
            printf("0\n");
        }
    }
}

int main() {
    int t;
    scanf("%d", &t);
    
	FOR(i, t){
	    printf("Scenario %d:\n", i+1);
	    solve();
	    printf("\n");
	}
    
	return 0;
}

 

 

 

'백준' 카테고리의 다른 글

26595 전투의 신  (1) 2023.10.07
18248 제야의 종  (1) 2023.10.07
28176 Maximum GCD  (0) 2023.09.17
11607 Grid  (0) 2023.09.16
27113 잠입  (0) 2023.09.09