Skip to content

BOJ 11724 ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ ํ’€์ดย #7

@allzeroyou

Description

@allzeroyou

๋ฌธ์ œ ๋ถ„์„

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„(๋ฌธ์ œ ์š”์•ฝ ๋ฐ ์กฐ๊ฑด ํŒŒ์•…)

๋ฐฉํ–ฅ ์—†๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ์„๋•Œ, ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ.

์ž…๋ ฅ

  • ์ •์ ์˜ ๊ฐœ์ˆ˜ N, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M(1 โ‰ค N โ‰ค 1,000, 0 โ‰ค M โ‰ค Nร—(N-1)/2)
  • M๊ฐœ์˜ ์ค„์— ๊ฐ„์„ ์˜ ์–‘ ๋์  u, v๊ฐ€ ์ฃผ์–ด์ง(1 โ‰ค u, v โ‰ค N, u โ‰  v)
  • ๊ฐ™์€ ๊ฐ„์„ ์€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง.

์ถœ๋ ฅ

  • ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„ (๋ฌธ์ œ ํ•ต์‹ฌ ํŒŒ์•…)

๋ฐฉํ–ฅ ์—†๋Š” ๊ทธ๋ž˜ํ”„๋Š” ์ฆ‰, ์ˆœํ™˜์„ฑ ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์—ฐ๊ฒฐ ์š”์†Œ๋Š” ๊ทธ๋ž˜ํ”„ ๋ณ„๋กœ ๋ฉ์–ด๋ฆฌ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•ด์ฃผ์–ด์•ผ ํ•จ(์ด๋•Œ ํƒ์ƒ‰ ์ˆœ์„œ๋Š” ์ƒ๊ด€์ด ์—†์Œ.)

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„์‹œโ†’ ์ธ์ ‘ ํ–‰๋ ฌ or ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(ํฌ์†Œ), ์ธ์ ‘ ํ–‰๋ ฌ(๋ฐ€์ง‘))

์ด๋•Œ ์ตœ๋Œ€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ Nร—(N-1)/2์ธ๋ฐ, ์ด ๊ฐ’์€ ํฐ ๊ฐ’(๋ฐ€์ง‘)์ธ๊ฐ€ ์ž‘์€ ๊ฐ’(ํฌ์†Œ)์ธ๊ฐ€?

u โ‰  v์ด๋ฏ€๋กœ nC2์ž„. nC2๋Š” ์ˆ˜์‹์œผ๋กœ Nร—(N-1)/2์ด๋‹ค. ์ด๋Š” N์ด 1000์ผ๋•Œ ํฐ ๊ฐ’์ด๋ฏ€๋กœ, ์ธ์ ‘ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ

์ตœ์ข… ์ฝ”๋“œ

import sys

input = sys.stdin.readline  # n์ด ์ตœ๋Œ“๊ฐ’์ผ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ๋น ๋ฅธ ์ž…๋ ฅ
# RecursionError ๋ฐฉ์ง€์šฉ
sys.setrecursionlimit(10 ** 8)

def dfs(now):  # ํ˜„์žฌ ๋…ธ๋“œ
    for nxt in range(n):  # ๋‹ค์Œ ์—ด
        if graph[now][nxt] and not chk[nxt]:  # ๊ทธ๋ž˜ํ”„๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๋ฐฉ๋ฌธ์„ ์•ˆ ํ–ˆ์„ ๊ฒฝ์šฐ
            chk[nxt] = True  # ๋ฐฉ๋ฌธ ์ฒดํฌ
            dfs(nxt)  # dfs ์‹คํ–‰

n, m = map(int, input().split())
# ์ธ์ ‘ ํ–‰๋ ฌ(N X N 2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [[0] * n for _ in range(n)]  # 0-based
# ๊ฐ„์„ 
for _ in range(m):
    u, v = map(lambda x: x - 1, map(int, input().split()))  # 1-based to 0-based
    graph[u][v] = 1  # ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์ž„.
    graph[v][u] = 1  # ๋ฌด๋ฐฉํ–ฅ==์–‘๋ฐฉํ–ฅ

# for i, row in enumerate(graph):
#     print(f'{i}: {row}')

ans = 0
# ๋ฐฉ๋ฌธ ์ฒดํฌ์šฉ
chk = [False] * n

for i in range(n):
    if not chk[i]:
        chk[i] = True
        ans += 1
        dfs(i)  # dfs
print(ans)

์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ œ์ถœ ํ•˜๋ฉด RecursionError ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ์žฌ๊ท€ depth๋ฅผ ์ดˆ๊ณผ(10*3)ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ์ตœ์ข… ์ฝ”๋“œ์ธ ์œ„์—๋Š” depth๋ฅผ ๋Š˜๋ ค์ฃผ์—ˆ๋‹ค.

RecursionError ๋ฐœ์ƒ ์ฝ”๋“œ

import sys

input = sys.stdin.readline  # n์ด ์ตœ๋Œ“๊ฐ’์ผ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ๋น ๋ฅธ ์ž…๋ ฅ

def dfs(now):  # ํ˜„์žฌ ๋…ธ๋“œ
    for nxt in range(n):  # ๋‹ค์Œ ์—ด
        if graph[now][nxt] and not chk[nxt]:  # ๊ทธ๋ž˜ํ”„๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ๋ฐฉ๋ฌธ์„ ์•ˆ ํ–ˆ์„ ๊ฒฝ์šฐ
            chk[nxt] = True  # ๋ฐฉ๋ฌธ ์ฒดํฌ
            dfs(nxt)  # dfs ์‹คํ–‰

n, m = map(int, input().split())
# ์ธ์ ‘ ํ–‰๋ ฌ(N X N 2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [[0] * n for _ in range(n)]  # 0-based
# ๊ฐ„์„ 
for _ in range(m):
    u, v = map(lambda x: x - 1, map(int, input().split()))  # 1-based to 0-based
    graph[u][v] = 1  # ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์ž„.
    graph[v][u] = 1  # ๋ฌด๋ฐฉํ–ฅ==์–‘๋ฐฉํ–ฅ

# for i, row in enumerate(graph):
#     print(f'{i}: {row}')

ans = 0
# ๋ฐฉ๋ฌธ ์ฒดํฌ์šฉ
chk = [False] * n

for i in range(n):
    if not chk[i]:
        chk[i] = True
        ans += 1
        dfs(i)  # dfs
print(ans)

11724

๋А๋‚€์ 

๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋Š” dfs, bfs๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•จ์€ ์•Œ๊ฒ ๋Š”๋ฐ ์ ์ ˆํ•˜๊ฒŒ ์ธ์ ‘๋ฆฌ์ŠคํŠธ, ์ธ์ ‘ํ–‰๋ ฌ์„ ์„ ํƒํ•ด ํ‘ธ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค.

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions