https://www.acmicpc.net/problem/11724
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
풀이
연결요소를 구해야 하는 문제인데 처음에는 연결요소가 뭘 출력하라는건지 헷갈렸는데
뭉쳐진 덩어리의 갯수를 구하는 문제였다.
더이상 연결된 요소가 없을 때 까지 탐색해야 하므로 dfs 깊이 탐색을 사용했다.
연결관계를 나타낼 리스트 arr과 방문 여부를 체크할 visited 리스트를 만들었다
입력을 받을 때 방향이 없는 그래프라서
arr[u].append(v)
arr[v].append(u)
양방향으로 입력했다.
재귀를 돌면서 만약 방문 했을 경우 visited에 1을 입력하고, 방문하지 않은 경로만 이동한다
dfs를 완료한것은 더이상 탐색할 노드가 없다는 뜻이니 ans += 1을 했다
python코드
# 11724 연결 요소의 개수
import sys
sys.setrecursionlimit(10**6)
def dfs(n):
for i in range(len(arr[n])):
if visited[arr[n][i]] == 0:
visited[arr[n][i]] = 1
dfs(arr[n][i])
N, M = map(int,input().split())
arr = [[] * (N+1) for _ in range(N+1)]
visited = [0] * (N+1)
ans = 0
for m in range(M):
u,v = map(int,sys.stdin.readline().rstrip().split())
arr[u].append(v)
arr[v].append(u)
for i in range(1, N+1):
if visited[i] == 0:
visited[i] = 1
dfs(i)
ans += 1
print(ans)
'study > 백준' 카테고리의 다른 글
[백준] 1172. 가장 긴 감소하는 부분 수열 : python (0) | 2022.09.26 |
---|---|
[백준] 1991. 트리 순회 : python (0) | 2022.09.23 |
[백준] 11656. 접미사 배열 : python (0) | 2022.09.16 |
[백준] 19583. 싸이버개강총회 : python (0) | 2022.09.15 |
[백준] 16165. 걸그룹 마스터 준석이 : python (0) | 2022.09.14 |