개발/algorithm

[백준 9372번] 상근이의 여행 - python / 크루스칼 알고리즘

zzi_on2 2022. 4. 29. 20:47

문제 링크

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)