2022. 12. 21. 01:26ㆍBaekjoon/Gold
https://www.acmicpc.net/problem/4803
4803번: 트리
입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다.
www.acmicpc.net
문제 설명
문제
그래프는 정점과 간선으로 이루어져 있다. 두 정점 사이에 경로가 있다면, 두 정점은 연결되어 있다고 한다. 연결 요소는 모든 정점이 서로 연결되어 있는 정점의 부분집합이다. 그래프는 하나 또는 그 이상의 연결 요소로 이루어져 있다.
트리는 사이클이 없는 연결 요소이다. 트리에는 여러 성질이 있다. 예를 들어, 트리는 정점이 n개, 간선이 n-1개 있다. 또, 임의의 두 정점에 대해서 경로가 유일하다.
그래프가 주어졌을 때, 트리의 개수를 세는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 n ≤ 500과 m ≤ n(n-1)/2을 만족하는 정점의 개수 n과 간선의 개수 m이 주어진다. 다음 m개의 줄에는 간선을 나타내는 두 개의 정수가 주어진다. 같은 간선은 여러 번 주어지지 않는다. 정점은 1번부터 n번까지 번호가 매겨져 있다. 입력의 마지막 줄에는 0이 두 개 주어진다.
출력
입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다.
예제 입력 1
6 3
1 2
2 3
3 4
6 5
1 2
2 3
3 4
4 5
5 6
6 6
1 2
2 3
1 3
4 5
5 6
6 4
0 0
예제 출력 1
Case 1: A forest of 3 trees.
Case 2: There is one tree.
Case 3: No trees.
문제 풀이
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
def is_cycle(x, prev):
visited[x] = True
for y in graph[x]:
if visited[y]:
if y != prev:
return True
else:
if is_cycle(y, x):
return True
return False
T = 1
while True:
N, M = map(int, input().split())
if N == 0 and M == 0:
break
graph = [[] for _ in range(N + 1)]
visited = [False for _ in range(N + 1)]
for _ in range(M):
x, y = map(int, input().split())
graph[x].append(y)
graph[y].append(x)
cnt = 0
for i in range(1, N + 1):
if not visited[i]:
if not is_cycle(i, 0):
cnt += 1
if cnt == 0:
print(f'Case {T}: No trees.')
elif cnt == 1:
print(f'Case {T}: There is one tree.')
else:
print(f'Case {T}: A forest of {cnt} trees.')
T += 1
'Baekjoon > Gold' 카테고리의 다른 글
[Baekjoon] 환승 / Python, 파이썬 / 5214 (0) | 2022.12.21 |
---|---|
[Baekjoon] 이분 그래프 / Python, 파이썬 / 1707 (0) | 2022.12.21 |
[Baekjoon] 숫자고르기 / Python, 파이썬 / 2668 (0) | 2022.12.20 |
[Baekjoon] 텀 프로젝트 / Python, 파이썬 / 9466 (0) | 2022.12.20 |
[Baekjoon] 노드사이의 거리 / Python, 파이썬 / 1240 (0) | 2022.12.20 |