코딩테스트/백준

[백준][C++]11724번 연결 요소의 개수

윤깡패 2023. 9. 16. 13:46

문제

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

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어

www.acmicpc.net

 

 

풀이

유니온 파인드(Union-Find) 알고리즘

 

유니온 파인드(Union-Find) 알고리즘

유니온 파인드(Union-Find) 알고리즘 특정 2개의 노드를 연결해 1개의 집합으로 묶는 union 연산 + 두 노드가 같은 집합에 속해 있는지를 확인하는 find 연산 유니온 파인드 알고리즘 핵심 이론 union 연

soobin0821.tistory.com

 

 

코드

#include <iostream>
#include <vector>
using namespace std;

void union_parent(int a, int b);
int find_parent(int a);
static vector<int> parent;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int N, M;
  cin >> N >> M;

  parent.resize(N + 1);
  for(int i = 0; i <= N; i++)
  {
    parent[i] = i;
  }

  for(int i = 0; i < M; i++)
  {
    int u, v;
    cin >> u >> v;
    union_parent(u, v);
  }

  int count = 0;
  for(int i = 1; i <= N; i++)
  {
    if(i == parent[i])
    {
      count++;
    }
  }

  cout << count;	// 연결 요소 개수 출력
  
  return 0;
}

void union_parent(int a, int b)
{
  a = find_parent(a);
  b = find_parent(b);

  if(a < b)
  {
    parent[b] = a;
  }
  else if(a > b)
  {
    parent[a] = b;
  }
}

int find_parent(int a)
{
  if(a == parent[a])
  {
    return parent[a];
  }
  else
  {
    return parent[a] = find_parent(parent[a]);
  }
}

 

 

 

 

 

728x90