본문 바로가기
알고리즘/[python] 백준 BOJ

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

by Alan_Kim 2023. 1. 22.
728x90
반응형

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

문제 해결

그래프가 몇개로 분리되어있는지 개수를 세는 문제

visited 리스트를 통해 지나간 점을 체크하면서 1번부터 n번까지 dfs나 bfs를 돌리면서

몇번 돌려야 visited 리스트 원소가 모두 True가 되는지 count 한다고 생각하면 된다.

 

CODE(dfs)

import sys
sys.setrecursionlimit(5000)
n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

visited = [False]*(n+1)
def dfs(start):
    global visited
    visited[start] = True
    for next in graph[start]:
        if visited[next] == False:
            dfs(next)
    return
ans = 0
for i in range(1,n+1):
    if visited[i] == False:
        if not graph[i]:
            visited[i] = True
        else:
            dfs(i)
        ans +=1
print(ans)

CODE(bfs)

import sys
from collections import deque
input = sys.stdin.readline

n, m = map(int, input().split())
graph = [[] for _ in range(n)]
visited = [False]*(n+1)
def bfs(start):
    que = deque()
    que.append(start)
    visited[start] = True
    while que:
        now = que.popleft()
        for next in graph[now]:
            if not visited[next]:
                visited[next] = True
                que.append(next)
ans = 0
for i in range(n+1):
    if visited[i] == False:
        if not graph[i]:
            ans += 1
            visited[i] = True
        else:
            bfs(i)
            ans +=1
print(ans)
728x90
반응형

댓글