문제
양방향 그래프의 연결 요소를 구하는 문제로, DFS의 대표적인 유형의 문제 중 하나이다.
풀이
DFS는 소스코드 프레임에 아래와 같은 것들이 자주 쓰인다.
visted = [False]*(n), count = 0, graph = [[] for _ in range(n)]
첫 번째 visited는 노드를 방문했는지 확인하기 위함이고, 두 번째는 문제에서 요구하는 것을 count, 마지막은 graph이다.
그래프의 특성에, 방향이 없다고 했기 때문에, 그래프 생성할 때 인덱스와 값을 switch해서 두번 씩 적어줘야 한다.
for i in range(m):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
DFS를 최초로 호출하는 for 반복문의 길이는 n+1 이다.
전체 코드
import sys
sys.stdin =open('in.txt','rt')
input = sys.stdin.readline
sys.setrecursionlimit(10**6) # 재귀함수 깊이 제한 풀기
n,m = map(int, input().split())
graph = [[] for _ in range(n+1)]
graph[0] = [0,0]
for i in range(m):
u, v = map(int, input().split())
graph[u].append(v)
graph[v].append(u)
cnt = 0
v = [False for _ in range(n+1)]
def DFS(g, s, v):
v[s] = True
for i in g[s]: # 그래프 돌면서 값 하나씩 뽑아서,
if not v[i]: # 방문 이력도 없으면,
DFS(g, i, v)
for c in range(1, len(v)):
if v[c] == False:
cnt += 1
DFS(graph, c, v)
print(cnt)
'⚡️algorithm' 카테고리의 다른 글
[DFS, 파이썬] 백준 11403. 경로찾기 (0) | 2022.04.27 |
---|---|
[DFS] 백준 2583. 영역구하기 (0) | 2022.04.26 |
[DP] 백준 12865. 평범한 배낭 (0) | 2022.04.21 |
[DP] 백준 11051. 이항계수2 (feat. 파스칼의 삼각형) (0) | 2022.04.20 |
[DP] 백준 2294. 동전2 - ing (0) | 2022.04.19 |