장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • 프로그래머스
  • Visual Studio
  • DP
  • 파이썬
  • JS
  • 프로그래밍언어
  • BFS
  • Priority Queue
  • 기초 지식
  • python3
  • CS
  • recursion
  • JavaScript
  • DFS
  • PS
  • Implementation
  • 알고리즘
  • Stack
  • 코딩테스트
  • pypy3
  • codesandbox
  • 씨포유
  • 자료구조
  • 백준
  • 자바스크립트
  • Kruskal algorithm
  • nodejs
  • bitmask
  • Network
  • C

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #1197- 최소 스패닝 트리 (파이썬, Python3)
PS/백준

[백준(BOJ)] #1197- 최소 스패닝 트리 (파이썬, Python3)

2022. 8. 2. 11:15
728x90

문제

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

 

 


문제 풀이

이 문제는 최소 신장 트리의 가중치를 구하는 문제로 크루스칼 알고리즘을 적용하여 풀었습니다.

 

2022.07.29 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 크루스칼(Kruskal) 알고리즘

 

[파이썬으로 배우는 알고리즘] 크루스칼(Kruskal) 알고리즘

크루스칼(Kruskal) 알고리즘이란? 2022.07.28 - [PS/알고리즘 이론] - [파이썬으로 배우는 알고리즘] 최소 신장 트리(MST) [파이썬으로 배우는 알고리즘] 최소 신장 트리(MST) 신장 트리 신장 트리(Spanning Tre

c4u-rdav.tistory.com

 

입력으로 두 노드의 번호와 가중치가 들어오기 때문에 이 간선 정보를 사용하여 바로 크루스칼 알고리즘에 적용하였습니다.

 

문제 풀이에 대해 더 깊게 알고싶으신 분들은 위의 글에서 세세하게 설명하니 참고하시면 될 것 같네요!

 


구현

코드

import sys
input = sys.stdin.readline

def find(v):
    if v != root[v]:
        root[v] = find(root[v])
    return root[v]

def union(v1, v2):
    v1 = find(v1)
    v2 = find(v2)
    
    if v1 < v2:
        root[v2] = v1
    else:
        root[v1] = v2
        
def is_connected(v1, v2):
    v1 = find(v1)
    v2 = find(v2)
    
    if v1 == v2:
        return True
    else:
        return False

def kruskal():
    sum_w = 0
    edge_info.sort(key = lambda x: x[2])
    for v1, v2, weight in edge_info:
        if not is_connected(v1, v2):
            sum_w += weight
            union(v1, v2)
    return sum_w

if __name__ == "__main__":
    v, e = map(int, input().split())
    edge_info = list()
    root = list(range(v+1))
    for _ in range(e):
        edge_info.append(list(map(int, input().split())))
    print(kruskal())

결과

728x90
반응형
저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #1005- ACM Craft (파이썬, PyPy3)  (2) 2022.08.10
[백준(BOJ)] #12100- 2048 (Easy) (파이썬, Python3)  (2) 2022.08.09
[백준(BOJ)] #1463- 1로 만들기 (파이썬, Python3)  (0) 2022.07.26
[백준(BOJ)] #1717- 집합의 표현 (파이썬, Python3)  (0) 2022.07.25
[백준(BOJ)] #11000- 강의실 배정 (파이썬, Python3)  (2) 2022.07.23
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #1005- ACM Craft (파이썬, PyPy3)
    • [백준(BOJ)] #12100- 2048 (Easy) (파이썬, Python3)
    • [백준(BOJ)] #1463- 1로 만들기 (파이썬, Python3)
    • [백준(BOJ)] #1717- 집합의 표현 (파이썬, Python3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바