[파이썬, 자바] 백준 1506 : 경찰서 (플레5)
풀이
방향성 생각
- 간선 정보가 인접행렬로 나와있다.
- N이 작아서 인접 리스트를 구현하는 대신 그냥 인접행렬 사용하기
- 문제를 해석하면 SCC가 몇 개나 있는지 확인하는 문제이다.
- 각 SCC 내에서 가장 작은 건설 cost를 구해서 더해주면 되는 문제
파이썬
from collections import deque
import sys
input = lambda : sys.stdin.readline().strip()
N = int(input())
arr = list(map(int,input().split()))
G = [list(map(int,input())) for _ in range(N)]
# SCC 방문 / 카운팅 / 스택 관리
V = [-1]*N
P = [-1]*N
counter = [0]
stack = deque()
on_stack = [False]*N
# 타잔 알고리즘
SCC = []
def dfs(x):
V[x] = counter[0]
P[x] = counter[0]
counter[0] += 1
stack.append(x)
on_stack[x] = True
for nx in range(N):
if G[x][nx]:
if V[nx] == -1:
dfs(nx)
P[x] = min(P[x], P[nx])
elif on_stack[nx]:
P[x] = min(P[x], V[nx])
if V[x] == P[x]:
scc = []
while True:
w = stack.pop()
on_stack[w] = False
scc.append(w)
if w == x:
break
SCC.append(scc)
# 탐색
for x in range(N):
if V[x] == -1:
dfs(x)
# 답
answer = 0
for scc in SCC:
answer += min(arr[x] for x in scc)
print(answer)
코멘트
- .
'Algorithm > Graph' 카테고리의 다른 글
[자바] SWEA 7733 : 치즈 도둑 (D4) (0) | 2025.03.09 |
---|---|
[파이썬] SWEA 1267 : 작업 순서 (test) (0) | 2025.03.09 |
[파이썬] SWEA 1247 : 최적 경로 (D5) (0) | 2025.03.09 |
[파이썬, 자바] 백준 4196 : 도미노 (플레4) (0) | 2025.03.08 |
[파이썬] 백준 2150 : Strongly Connected Component (플레5) (0) | 2025.03.07 |
[파이썬] 백준 16475 : 수학 미로 (골드1) (0) | 2025.03.07 |
[파이썬] 백준 22956 : 소나기 (골드1) (0) | 2025.03.06 |
댓글