Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 브루트포스
- Python
- 플로이드-워셜
- 싸피
- 모던 JavaScript 튜토리얼
- 해시 테이블
- boj
- JavaScript
- 에라토스테네스의 체
- 누적 합
- SSAFY
- 슬라이딩 윈도우
- 그리디
- 세그먼트 트리
- 문자열
- 구현
- 트리
- 정렬
- 2357
- BFS
- 맵
- 수학
- DFS
- 투 포인터
- 13164
- 애드 혹
- 정수론
- 이분 탐색
- 그래프
- DP
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 16947 - 서울 지하철 2호선 (Python) 본문
아이디어
DFS로 사이클을 찾고, BFS로 각 정점과 사이클까지의 거리를 구한다.
풀이
함수 dfs()에서 부모 정점이 아닌 자식 정점을 이미 방문했다면 해당 정점부터 현재 정점까지 사이클이 발생한다.
따라서 해당 정점 번호를 반환하며 현재 정점부터 역으로 해당 정점까지 사이클까지의 거리를 0으로 저장한다.
정점과 간선의 개수가 같고 모든 정점을 연결하는 간선이 주어지므로 사이클은 유일하다.
따라서 사이클을 발견한다면 더 이상 사이클을 찾을 필요가 없어 -1을 반환하며 함수를 종료해 나간다.
BFS에서 사이클에 포함되는 정점부터 시작해 각 정점과 사이클까지의 거리를 구한 후 출력한다.
import sys
sys.setrecursionlimit(10**4)
input = sys.stdin.readline
def solution():
def dfs(u, prev):
if visited[u]:
return u
visited[u] = 1
for v in graph[u]:
if v == prev:
continue
r = dfs(v, u)
if r == -1:
return -1
if r > 0:
D[u] = 0
stack.append(u)
if r == u:
return -1
return r
return 0
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
visited = [0]*(N+1)
D = [-1]*(N+1)
stack = []
dfs(1, 0)
while stack:
u = stack.pop()
for v in graph[u]:
if D[v] == -1:
D[v] = D[u]+1
stack.append(v)
print(*D[1:])
solution()
'알고리즘' 카테고리의 다른 글
[BOJ] 6137 - 문자열 생성 (Python) (0) | 2023.04.22 |
---|---|
[BOJ] 2262 - 토너먼트 만들기 (Python) (0) | 2023.04.21 |
[BOJ] 4781 - 사탕 가게 (Python) (0) | 2023.04.19 |
[BOJ] 1263 - 시간 관리 (Python) (0) | 2023.04.18 |
[BOJ] 18223 - 민준이와 마산 그리고 건우 (Python) (0) | 2023.04.18 |
Comments