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
# BFS로 안풀고 집합으로 풀어보기
import sys
if __name__ == '__main__':
n, m = map(int, sys.stdin.readline().strip().split())
# 간선이 없을때 처리
if m == 0:
print(n)
exit()
# 리스트와 집합 형식으로 받기
node_list, node_lset, total_node_set, cnt = [], [], set(), 1
for _ in range(m):
tm = list(sorted(map(int, sys.stdin.readline().strip().split())))
node_list.append(tm)
total_node_set.update(tm)
node_list.sort(key= lambda x:(x[0]))
# 두 숫자가 기존 집합에 없으면 새로운 집합을 만든다.
node_set = set(node_list[0])
for i in range(1, m):
if not (node_list[i][0] in node_set or node_list[i][1] in node_set):
cnt += 1
node_lset.append(node_set.copy())
node_set.clear()
node_set.update(node_list[i])
node_lset.append(node_set.copy())
# 교집합 검사
for i in range(len(node_lset)):
for j in range(i+1, len(node_lset)):
if node_lset[i] & node_lset[j] != set():
cnt -= 1
print(cnt - len(total_node_set) + n)
'백준 & 프로그래머스' 카테고리의 다른 글
백준.바이러스.2606.py (0) | 2023.09.15 |
---|---|
백준.등수 구하기.1205.py (0) | 2023.09.13 |
백준.올림픽.8979.py (0) | 2023.09.12 |
백준.디지털 티비.2816.py (0) | 2023.09.11 |
백준.카드게임.py (0) | 2023.09.11 |
댓글