알고리즘 저장소
백준 - 11724번 연결 요소의 갯수(Graph, Silver2, Python)
Diger
2022. 7. 24. 03:11
728x90
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
풀이 - 코드 참고
from collections import deque
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [[] for _ in range(n + 1)]
# 그래프 만들기
for _ in range(m):
x, y = map(int, input().split())
# graph[x] 에 append(y), graph[y] append(x) 하는 게무슨 의미인지..?
# --> 간선정보를 입력해주는 것
# --> x : 1, y : 5 라는 입력값이 있을 때
# --> 1번 노드와 5번 노드를 연결시켜주는 것이다.
graph[x].append(y)
graph[y].append(x)
print(graph)
# bfs 는 큐에서 하나씩 pop을 해가면서, pop 을 했을 때 그 원소가 가리키고 있는 원소를 또 들어갈 것임
def bfs(start):
# 큐에 시작하는 노드 넣기
queue = deque([start])
# 방문 시작노드 방문 처리
visited[start] = True
# 큐가 비어있을때 까지 반복
while queue:
# 탐색할 노드는 큐에서 하나씩 꺼내갈것임
node = queue.popleft()
# i = 해당 노드가 연결되어 있는 다른 노드를 가리킨다.
for col in graph[node]:
# 그 i 가 방문처리 되지 않았다면
if not visited[col]:
# 방문 처리 해주고,
visited[col] = True
# 큐에 삽입한다.
queue.append(col)
# 노드 갯수만큼 반복 리스트 생성
visited = [False] * (1 + n)
# 연결 요소 갯수
count = 0
# 1 ~ N번 노드를 순회
for i in range(1, n + 1):
# 만약 방문하지 않았다면
if not visited[i]:
# 만약 그래프가 비어있다면
# 연결 요소 갯수 +1 --> 그래프가 비어있다는 것은, 그 노드가 다음으로 이어진 내용이 없다는 것
# 방문 처리
if not graph[i]:
count += 1
visited[i] = True
# 만약 그래프가 비어있지 않다면 --> 다른 노드와 이어진 것이 있음
else:
bfs(i) # 해당 i를 시작노드로 bfs를 돈다.
count += 1 # 연결 요소 갯수 +1
print(count)
728x90