Algorithm problems, coding test/백준

[백준][11724][S2] 연결 요소의 개수

정수열 2022. 5. 23. 10:38

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.


기본적인 DFS 알고리즘에 "연결 요소의 개수"를 세는 기능을 추가한다.

DFS가 한 번 호출될 때 마다 연결 요소는 하나씩 늘어나게 만들면 된다.

 

import sys
sys.setrecursionlimit(5000)

N,M = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(N + 1)]
for _ in range(M):
    a, b = map(int, sys.stdin.readline().split())
    graph[a].append(b)
    graph[b].append(a)

visited = [False for i in range(N+1)]
visited[0] = True

def dfs(v):
    visited[v]=True
    for i in graph[v]:
        if not visited[i]:
            dfs(i)

count = 0
for i in range(len(visited)):
    if not visited[i]:
        dfs(i)
        count += 1

print(count)

 


배운점

- DFS 입력 방식을 바꾸기

# 간선과 간선 사이의 관계
[
[1 2]
[2 5]
[5 1]
[3 4]
[4 6]
]

--------------
# n번 노드가 어떤 노드와 연결되어 있는지의 관계
[[],[2],[5],[4],[6],[5],[]]
graph = [[] for _ in range(N+1)]
for _ in range(M):
	a ,b = mpa(int, sys.stdin.readline().split())
    graph[a].append(b) #n번 인덱스에, 어떤 노드와 연결되어 있는지 넣는다.
    graph[b].append(a) #반대의 경우도 넣는다.

- 가장 간단한 dfs 함수

def dfs(v):
    visited[v]=True
    for i in graph[v]: #그래프 확인
    	if not visited[i]: #방문 여부 확인
            dfs(i)

- 재귀 함수 최대 횟수 설정

import sys
sys.setrecursionlimit(5000)