문제 링크
https://www.acmicpc.net/problem/9372
9372번: 상근이의 여행
첫 번째 줄에는 테스트 케이스의 수 T(T ≤ 100)가 주어지고, 각 테스트 케이스마다 다음과 같은 정보가 주어진다. 첫 번째 줄에는 국가의 수 N(2 ≤ N ≤ 1 000)과 비행기의 종류 M(1 ≤ M ≤ 10 000) 가
www.acmicpc.net
풀이
크루스칼 알고리즘 사용
: 네트워크의 모든 정점을 최소 비용으로 연결하는 최적의 해답을 구하는 알고리즘
: 유니온 파인트로 구현 가능
같은 집합에 속하지 않은 비행기를 탈때마다 비행기의 개수를 하나씩 증가
import sys
input = sys.stdin.readline
# 같은 집합에 속하는지 판별
def find(x):
if x != parent[x]:
parent[x] = find(parent[x])
return parent[x]
# 같은 집합으로 합치기
def union(x,y):
x = find(x)
y = find(y)
if x == y:
return
if x < y:
parent[y] = x
else:
parent[x] = y
t = int(input())
for _ in range(t):
n, m = map(int,input().split())
# 부모 저장 테이블
parent = [0] * (n+1)
for i in range(1,n+1):
parent[i] = i
edges = []
# 간선들 정보 저장
for _ in range(m):
a, b = map(int,input().split())
edges.append((a,b))
edges.append((b,a))
# 비행기 개수
result = 0
for edge in edges :
a,b = edge
# 같은 집합에 속하지 않으면
if find(a) != find(b):
# 합치기
union(a,b)
# 비행기 개수 증가
result +=1
print(result)
'개발 > algorithm' 카테고리의 다른 글
[백준 10217번] KCM Travel - python (0) | 2022.04.29 |
---|---|
[백준 1197번] 최소 스패닝 트리 - python / 크루스칼 알고리즘 (0) | 2022.04.29 |
[백준 2623번] 음악 프로그램 - python / 위상 정렬 (0) | 2022.04.29 |
[백준 2610번] 회의 준비 - python (0) | 2022.04.29 |
[백준 2617번] 구슬 찾기 - python (0) | 2022.04.29 |