๐Ÿค–/๋ฐฑ์ค€

๋ฐฑ์ค€ 4195: ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ (Python)

sssbin 2022. 7. 28. 22:49

 

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

 

4195๋ฒˆ: ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜ F๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ๊ฐ’์€ 100,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ F๊ฐœ์˜ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„

www.acmicpc.net

 

์ž…๋ ฅ๋ฐ›๋Š” ์š”์†Œ๊ฐ€ ์‚ฌ๋žŒ์ด๋ฆ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์ž๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋”•์…”๋„ˆ๋ฆฌ(people)๋ฅผ ์„ ์–ธํ•˜๊ณ 

1. a, b ์ž…๋ ฅ๋ฐ›์•„์„œ

2. ๋”•์…”๋„ˆ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€, parent ์ถ”๊ฐ€

3. union

๊ทธ ํ›„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด

์›๋ž˜ count ํ•จ์ˆ˜๋ฅผ ์ผ๋Š”๋ฐ ์ œ๋Œ€๋กœ ๋ชป ์žก์•„๋‚ด๊ธธ๋ž˜ for๋ฌธ์„ ์ผ๋‹ค

 

ใ…Žใ…Ž์‹œ๊ฐ„์ดˆ๊ณผ

import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline

def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)

    if a < b:
        parent[b] = a
    else:
        parent[a] = b

t = int(input())

for i in range(t):
    f = int(input())
    people = dict()
    parent = []
    count = 0

    for j in range(f):
        a, b = input().split()

        if a not in people:
            people[a] = count
            parent.append(count)
            count += 1

        if b not in people:
            people[b] = count
            parent.append(count)
            count += 1

        a = people[a]
        b = people[b]
        union_parent(parent, a, b)

        check = find_parent(parent, a)
        res = 0
        for k in range(len(parent)):
            if check == find_parent(parent, parent[k]):
                res += 1
        print(res)

 

์šฐ์„  people ์ œ๊ฑฐ -> parent๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌ

๊ธฐ์กด union ํ•จ์ˆ˜๋Š” ์ˆซ์ž๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ์ˆ˜์ •

result ๋”•์…”๋„ˆ๋ฆฌ ์ถ”๊ฐ€ -> ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅ

 

parent์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ result + 1

union ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ˜•์„ฑํ•  ๋•Œ ๋‘ ์‚ฌ๋žŒ์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ํ•ฉ์นœ ๊ฐ’์„ ๋ถ€๋ชจ result์— ์ €์žฅํ•œ๋‹ค.

(๋ชจ๋“  ์š”์†Œ์˜ result ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ํž˜๋“ฆ)

๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ ๋ถ€๋ชจ๋ฅผ ์ฐพ์•„์„œ ๋ถ€๋ชจ์˜ result ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ฒฐ๊ณผ๋Š”,,, ๋งž์•˜์Šต๋‹ˆ๋‹ค!!

import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline

def find_parent(x):
    if parent[x] != x:
        parent[x] = find_parent(parent[x])
    return parent[x]

def union_parent(a, b):
    a = find_parent(a)
    b = find_parent(b)

    if a != b:
        parent[b] = parent[a]
        result[a] += result[b]

t = int(input())

for i in range(t):
    f = int(input())
    parent = dict()
    result = dict()

    for j in range(f):
        a, b = input().split()

        if a not in parent:
            parent[a] = a
            result[a] = 1

        if b not in parent:
            parent[b] = b
            result[b] = 1

        union_parent(a, b)
        print(result[find_parent(a)])