반응형
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
- 가상메모리
- 다익스트라
- 프로그래머스
- 투포인터
- 구현
- 다이나믹 프로그래밍
- 재귀
- 딕셔너리
- 브루트포스
- 가상메모리 관리
- 그리디
- 수학
- 백준
- 운영체제
- BFS
- 힙
- N과M
- 파이썬
- 에라스토테네스의 체
- MYSQL
- BOJ
- level1
- python
- programmers
- dfs
- 스택
- 코딩테스트
- level3
- level2
- DP
Archives
- Today
- Total
동캄의 코딩도장
백준 4803 [트리] 파이썬 본문
반응형
https://www.acmicpc.net/problem/4803
# 백준 4803 - 트리
import sys
from collections import deque
input = sys.stdin.readline
idx = 0 # 테스트 케이스 번호
while True:
idx += 1 # 현재 테스트 케이스 번호 증가
cnt = 0 # 트리의 개수를 셀 변수
N, M = map(int, input().split()) # 정점 수 N, 간선 수 M
if N == 0 and M == 0: # 종료 조건
break
visited = [False for _ in range(N+1)] # 정점 방문 여부
graph = [[] for _ in range(N+1)] # 인접 리스트로 그래프 표현
# 간선 정보 입력
for _ in range(M):
A, B = map(int, input().split())
graph[A].append(B)
graph[B].append(A)
# 각 정점마다 BFS로 연결된 컴포넌트를 탐색
for i in range(1, N+1):
if not visited[i]:
cnt += 1 # 새로운 연결 요소 발견 → 일단 트리라고 가정하고 +1
q = deque()
visited[i] = True
q.append((i, -1)) # (현재 노드, 이전 노드)
flag = True # 해당 연결 요소가 트리인지 여부
while q:
curr_node, prev_node = q.popleft()
for next_node in graph[curr_node]:
if next_node != prev_node: # 바로 이전에 왔던 노드는 무시
if visited[next_node]:
# 이미 방문한 노드를 다시 방문 → 사이클 존재
if flag: # 처음 사이클을 감지한 경우에만
flag = False
cnt -= 1 # 트리가 아님 → 카운트 취소
else:
visited[next_node] = True
q.append((next_node, curr_node))
# 트리 수에 따라 출력 포맷 변경
if cnt == 0:
print(f"Case {idx}: No trees.")
elif cnt == 1:
print(f"Case {idx}: There is one tree.")
else:
print(f"Case {idx}: A forest of {cnt} trees.")
반응형
'코테 > BOJ' 카테고리의 다른 글
| 백준 20955 [민서의 응급 수술] 파이썬 (0) | 2025.08.01 |
|---|---|
| 백준 22586 [트리 순회] 파이썬 (1) | 2025.07.31 |
| 백준 5214 [환승] 파이썬 (4) | 2025.07.31 |
| 백준 1043 [거짓말] 파이썬 (1) | 2025.07.30 |
| 백준 2617 [구슬 찾기] 파이썬 (2) | 2025.07.28 |