새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1197 최소 스패닝 트리

by 언호 2022. 2. 2.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

최소 스패닝 트리 문제로 크루스칼 알고리즘으로 접근했습니다.

2) 알고리즘

  • 크루스칼

3) 풀이 코드

사용 언어 - Python

def find_set(x):                    # 정점 x 의 최상단 정점을 찾음
    if x != s[x]:
        s[x] = find_set(s[x])
    return s[x]


def union(x, y):                    # 두개의 집합을 서로 합침
    s[find_set(y)] = find_set(x)


def kruskal():                              # 크루스칼 알고리즘
    global answer 

    edge_cnt, idx = 0, 0                    # 모두 연결이 되었는지 확인을 위한 변수, 간선 집합의 인덱스 번호

    while edge_cnt != V-1:                  # 정점-1 개 만큼 연결되어 있지 않으면
        x = linked[idx][0]                  # 두개의 정점
        y = linked[idx][1]

        while find_set(x) != find_set(y):   # 두개가 연결되어 있지 않으면
            union(x, y)                     # 연결
            edge_cnt += 1                   # 연결 개수 증가
            answer += linked[idx][2]        # 정답 증가
        idx += 1                            # 간선 인덱스 증가


V, E = map(int, sys.stdin.readline().split())       # 정점의 개수, 간선의 개수

s = [x for x in range(V+1)]                         # 정점들이 연결되었는지 확인을 위한 집합
linked = sorted([list(map(int, sys.stdin.readline().split())) for _ in range(E)], key=lambda x: x[2])       # 연결 관계
answer = 0

kruskal()   
print(answer)

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 4358 생태학  (0) 2022.02.04
[백준] 16398 행성 연결  (0) 2022.02.03
[프로그래머스] 뉴스 클러스터링  (0) 2022.02.01
[백준] 15686 치킨 배달  (0) 2022.01.31
[백준] 3190 뱀  (0) 2022.01.30

댓글