오뚝이개발자

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

코딩 테스트/백준

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

땅어 2020. 3. 15. 17:56
728x90
300x250

문제


https://www.acmicpc.net/problem/11724

 

11724번: 연결 요소의 개수

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

www.acmicpc.net

 

생각의 흐름


adjacent matrix를 만들어 dfs로 탐색한다.

 

깨달은 점


adjacent list를 만들어 dfs로 탐색하는 방법도 있다.(아래 코드를 첨부한다. 출처 : https://home-body.tistory.com/287)

 

코드


방법 1(adjacent matrix 이용)

import sys

N, M = 0, 0
arr = []
visit = []
cnt = 0

def dfs(x):

    if visit[x] == 1:
        return
    visit[x] = 1
    for i in range(N):
        if arr[x][i] == 1:
            dfs(i)


if __name__=='__main__':

    sys.setrecursionlimit(10**8)
    # N은 정점, M은 간선의 갯수
    N, M = map(int, sys.stdin.readline().split())
    arr = [[] for i in range(N)]
    visit = [0] * N

    for i in range(N):
        arr[i] = visit[:]

    for _ in range(M):
        u, v = map(int, sys.stdin.readline().split())
        arr[u-1][v-1] = 1
        arr[v-1][u-1] = 1

    for i in range(N):
        if visit[i] == 0:
            dfs(i)
            cnt += 1

    print(cnt)

 

방법 2(adjacent list 이용)

def dfs(v):
    visited[v] = True
    for e in adj[v]:
        if not visited[e]:
            dfs(e)
            
N, M = map(int, input().split())
adj = [[] for i in range(N+1)]
visited = [False] * (N + 1)
cnt = 0
 
for i in range(M):
    input_data = list(map(int, input().split()))
    adj[input_data[0]].append(input_data[1])
    adj[input_data[1]].append(input_data[0])
    
for i in range(1, len(visited)):
    if not(visited[i]):
        cnt += 1
        dfs(i)
        
print(cnt)
728x90
300x250

'코딩 테스트 > 백준' 카테고리의 다른 글

[백준2667] 단지번호붙이기  (0) 2020.03.20
[백준1261] 알고스팟  (0) 2020.03.18
[백준4963] 섬의 개수  (0) 2020.03.14
[백준15666] N과 M (12)  (0) 2020.03.14
[백준15665] N과 M (11)  (0) 2020.03.14
Comments