Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 트라이
  • 기하
  • 이분탐색
  • 트리
  • 투포인터
  • 구현
  • 유니온 파인드
  • KMP
  • 세그먼트 트리
  • 문자열
  • 수학
  • C++
  • 최소 스패닝 트리
  • 큐
  • 백트래킹
  • 브루트포스
  • 우선순위큐
  • 누적합
  • SCC
  • LCA
  • 분할정복
  • 정렬
  • 정수론
  • 조합론
  • 동적계획법
  • 위상 정렬
  • UC++
  • 백준
  • 그래프
  • 스택

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 1717번 문제
공부 및 정리/백준 코드

[C++]백준 - 1717번 문제

2021. 9. 26. 15:51

1717번: 집합의 표현 (acmicpc.net)

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

 

1717번 : 집합의 표현


초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.

집합을 표현하는 프로그램을 작성하시오.

 

입력


첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a와 b는 n 이하의 자연수 또는 0이며 같을 수도 있다.

 

출력


1로 시작하는 입력에 대해서 한 줄에 하나씩 YES/NO로 결과를 출력한다. (yes/no 를 출력해도 된다)

 

 

 


 

생각해 볼 점


유니온에 대한 문제입니다.

 

유니온을 만드는 방법은 아래 링크를 참고합니다.

 

브랜든의 블로그 :: [알고리즘] 유니온 파인드 (Union-Find) (tistory.com)

 

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

유니온 파인드(Union-Find) ① 유니온 파인드란? ▷ 대표적 그래프 알고리즘으로 '합집합 찾기'라는 의미를 가지고 있습니다. ▷ 상호 배타적 집합(Disjoint-set)이라고도 합니다. ▷ 여러 노드가 존재

brenden.tistory.com

 

이제, 1로 시작하는 입력이 들어오면, A와 B가 유니온 관계인지만 확인하면 됩니다.

 

코드


#include <iostream>
using namespace std;

int *parent;
//부모 찾기
int find_parent(int target)
{
    if(target == parent[target]) return target;
    return parent[target] = find_parent(parent[target]);
    
}

//유니온 만들기
void set_union(int a, int b)
{
    a = find_parent(a);
    b = find_parent(b);
    
    if(a != b)
    {
        parent[b] = a;
    }
}


int main() 
{
	int N, M;
	scanf("%d %d", &N, &M);
	parent = new int[N + 1];
	for(int i = 0; i < N + 1; i++) parent[i] = i;
	for(int i = 0; i < M; i++)
	{
	    int is_check, a, b;
	    scanf("%d %d %d", &is_check, &a, &b);
	    
	    if(!is_check) set_union(a, b);
	    else 
	    {
	        if(find_parent(a) == find_parent(b)) printf("YES\n");
	        else printf("NO\n");
	    }
	}

	delete[] parent;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 14003번 문제  (0) 2021.09.28
[C++]백준 - 1259번 문제  (0) 2021.09.28
[C++]백준 - 6549번 문제  (0) 2021.09.26
[C++]백준 - 11723번 문제  (0) 2021.09.25
[C++]백준 - 4803번 문제  (0) 2021.09.25
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 14003번 문제
    • [C++]백준 - 1259번 문제
    • [C++]백준 - 6549번 문제
    • [C++]백준 - 11723번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바