본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 1849 영준이의 무게측정

by 까망 하르방 2021. 5. 23.
반응형

출처: SWEA

Approach

Disjoint-Set & Union-Find 

 

Disjoint-Set & Union-Find

Disjoint-Set, 상호 배타적 집합 서로 중복되지 않는 부분 집합들을 의미 (교집합 존재 X) Union-Find Disjoint-Set을 표현할 때 사용하는 알고리즘. ex) 여러 노드가 존재할 때, 두 개의 노드를 선택해서 두

zoosso.tistory.com


#include <stdio.h>

const int MAX_N = 1e6 + 2;
char cmd;
int N, M, TC, a, b, w;
int parent[MAX_N], rank[MAX_N], W[MAX_N];

int Find(int n)
{
    if (parent[n] == n)
        return n;
    W[n] += W[parent[n]];
    return parent[n] = Find(parent[n]);
}

void Union(int a, int b, int w)
{
    int pa = Find(a), pb = Find(b);
    if (pa == pb)
        return;

    if (rank[pa] < rank[pb]) 
    {
        parent[pa] = pb;
        W[pa] = W[b] - W[a] + w;
    }
    else 
    {
        parent[pb] = pa;
        W[pb] = W[a] - W[b] - w;

        if (rank[pa] == rank[pb])
        {
            rank[pa]++;
        }
    }
}

int main(void)
{
    // freopen("input.txt", "r", stdin);
    scanf("%d", &TC);
    for (int tc = 1; tc <= TC;++tc) {
        scanf("%d %d", &N, &M);
        for (int i = 1; i <= N; i++) 
        {
            parent[i] = i;
            W[i] = rank[i] = 0;
        }

        printf("#%d ", tc);
        for (int i = 1; i <= M; i++) {
            scanf(" %c %d %d", &cmd, &a, &b);
            if (cmd == '!') {
                scanf("%d", &w);
                Union(a, b, w);
            }
            else {
                if (Find(a) == Find(b))
                    printf("%d ", W[a] - W[b]);
                else
                    printf("UNKNOWN ");
            }
        }
        printf("\n");
    }
    return 0;
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 10763 조 신나  (0) 2021.05.23
[SWEA] 1843 영준이의 숫자 고르기  (0) 2021.05.23
[SWEA] 4534 트리 흑백 색칠  (0) 2021.05.22
[SWEA] 9236 곰돌이  (0) 2021.05.22
[SWEA] 4747 사막에서 만난 지니  (0) 2021.05.22

댓글