백준 알고리즘 7511번 : 소셜 네트워킹 어플리케이션

Zoo Da·2021년 12월 21일
0

백준 알고리즘

목록 보기
307/337
post-thumbnail

링크

https://www.acmicpc.net/problem/7511

sol1) 유니온 파인드

#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define int int64_t
using namespace std;

struct UnionFind {
	vector<int> parent, cnt;
	UnionFind(int n) : parent(n), cnt(n, 1) {
		iota(parent.begin(), parent.end(), 0);
	}
	int Find(int x) {
		return x == parent[x] ? x : parent[x] = Find(parent[x]);
	}
	bool Union(int a, int b) {
		a = Find(a), b = Find(b);
		if (a == b) return 0;
		if (a > b) swap(a, b);
		parent[b] = a;
		cnt[a] += cnt[b];
		return 1;
	}
};

int32_t main(){
  fastio;
  int t; cin >> t;
  for(int i = 1; i <= t; i++){
    int n,k,m; cin >> n >> k;
    UnionFind UF(n);
    for(int i = 0; i < k; i++){
      int a,b; cin >> a >> b;
      UF.Union(a, b);
    }
    cin >> m;
    cout << "Scenario " << i<<":" << "\n";
    while(m--){
      int u,v; cin >> u >> v;
      cout << (UF.Find(u) == UF.Find(v) ? 1 : 0) << "\n";
    }
    if(i != t) cout << "\n";
  }
}

두 정점의 부모노드가 다르다면 같은 집합에 있지 않기 때문에 0을 출력해주면 됩니다.

profile
메모장 겸 블로그

0개의 댓글