πŸ”₯ Algorithm/λ°±μ€€

[λ°±μ€€] 2653번: μ•ˆμ •λœ 집단 - 파이썬

sckwon770 2022. 11. 16. 02:15

문제

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

 

2653번: μ•ˆμ •λœ 집단

μ£Όμ–΄μ§„ μž…λ ₯이 μ•ˆμ •λ˜μ§€ μ•Šμ€ μ§‘λ‹¨μ˜ κ²½μš°λŠ” 첫쀄에 빈칸 없이 0을 좜λ ₯ν•œλ‹€. μ•ˆμ •λœ μ§‘λ‹¨μ˜ κ²½μš°λŠ” 첫쀄에 μ„œλ‘œ μ’‹μ•„ν•˜λŠ” μ†Œμ§‘λ‹¨μ˜ 수λ₯Ό 빈칸 없이 좜λ ₯ν•˜κ³ , κ·Έ λ‹€μŒ μ€„λΆ€ν„°λŠ” 각 μ€„λ§ˆλ‹€ 각 μ†Œ

www.acmicpc.net

 

ν•΄μ„€

문제 μ„€λͺ…κ³Ό 쑰건이 λ³΅μž‘ν•˜κ³  길게 μ„€λͺ…λ˜μ–΄ μžˆλŠ”λ°, 핡심은 κ°„λ‹¨ν•˜λ‹€.

 

  1. μ‚¬λžŒ κ°„μ˜ μš°ν˜Έλ„κ°€ λ‹€λ₯΄λ©΄ λΆˆμ•ˆμ •ν•œ 집단이닀.

이 λΆ€λΆ„을 κ°„μ ‘μ μœΌλ‘œ ν‘œν˜„ν•˜κ³  μžˆλŠ”λ°, μ„œλ‘œ μ’‹μ•„ν•˜λŠ” μ‚¬λžŒλΌλ¦¬ κ·Έλ£Ήμ„ λ‚˜λˆ„λ©΄ μ•ˆμ •λœ μ§‘단을 λ§Œλ“€ μˆ˜ μžˆλŠ”λ° μ„œλ‘œμ˜ μš°ν˜Έλ„κ°€ λ‹€λ₯΄λ©΄ κ·Έλ£Ήμ„ λ‚˜λˆŒ μˆ˜κ°€ μ—†λ‹€.

 

  2. DFS둜 νƒμƒ‰ν•˜λ©΄μ„œ κ·Έλ£Ήν™”ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό μ €μž₯ν•œλ‹€.

ν•œ λ²ˆμ˜ DFS νƒμƒ‰μ—μ„œ μ°Ύμ•„μ§€λŠ” μ‚¬λžŒμ€ κ°™μ€ κ·Έλ£Ήμ΄λ‹€.

풀이

import sys; readline = sys.stdin.readline

n = int(readline())
relation = [list(map(int, readline().split())) for _ in range(n)]

stable = True
for i in range(n):
    for j in range(i + 1, n):
        if relation[i][j] != relation[j][i]:
            stable = False
            break
    if not stable: break

visited = [False] * n
group = []
count = 0
for i in range(n):
    if visited[i]:
        continue

    visited[i] = True
    count += 1
    group.append([i+1])
    g_index = count - 1
    for j in range(n):
        if relation[i][j] != 0 or i == j:
            continue

        group[g_index].append(j+1)
        visited[j] = True

for g in group:
    if len(g) < 2:
        stable = False
        break

if stable:
    print(count)
    for g in group:
        print(*g)
else:
    print(0)