[파이썬] 백준 26146 : 즉흥 여행 (easy) (플레5)
풀이
방향성 생각
- 어떤 노드에서 출발하든 모든 노드를 방문할 수 있어야 한다.
- 모든 노드가 하나의 SCC의 component인 경우이다.
- 따로 응축그래프를 만들고 진입차수를 계산하거나 BFS를 돌릴 필요가 없다.
파이썬
from collections import deque
import sys
sys.setrecursionlimit(10**6)
input = lambda : sys.stdin.readline().strip()
N,M = map(int,input().split())
G = [[] for _ in range(N+1)]
for _ in range(M):
a,b = map(int,input().split())
G[a].append(b)
V = [-1]*(N+1)
P = [-1]*(N+1)
counter = [0]
stack = deque()
on_stack = [False]*(N+1)
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 G[x]:
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(1,N+1):
if V[x]==-1:
dfs(x)
print('Yes' if len(SCC) == 1 else 'No')
코멘트
- 파이썬이 자료형이 편해서 대충대충 짜느라 2D 배열 좌표를 1차원으로 반환하는 방식은 잘 안썼는데, 굳이 사이즈 크게 튜플로 할당하거나 ArrayList 쓰는 방식보다는 간단하게 i*W+j로 반환하는게 더 나은 듯 하다.
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 18133 : 가톨릭대학교에 워터 슬라이드를?? (플레4) (0) | 2025.03.09 |
---|---|
[자바] SWEA 7733 : 치즈 도둑 (D4) (0) | 2025.03.09 |
[파이썬] SWEA 1267 : 작업 순서 (test) (0) | 2025.03.09 |
[파이썬] SWEA 1247 : 최적 경로 (D5) (0) | 2025.03.09 |
[파이썬, 자바] 백준 1506 : 경찰서 (플레5) (0) | 2025.03.09 |
[파이썬, 자바] 백준 4196 : 도미노 (플레4) (0) | 2025.03.08 |
[파이썬] 백준 2150 : Strongly Connected Component (플레5) (0) | 2025.03.07 |
댓글