Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 피보나치수열
- 오픽노잼공부방법
- 영어회화
- fibo
- topdown
- 오픽
- 오픽공부법
- 오픽점수잘받는방법
- 이진탐색 #나무 자르기
- 안드로이드주석
- 안드로이드
- 바텀업
- 다이나믹프로그래밍
- English
- opic
- 디피
- 오픽가격
- dp
- XML주석
- 영어말하기
- 주석
- ㅂ
- stack 스택
- 오픽노잼
- 메모이제이션
- 이진탐색
- 탑다운
- dynamicProgramming
- XML
Archives
RUBY
어두운 길 본문
출처:: University of Ulm Local Contest
분류:: 크루스칼
1. 문제 이해 및 해결과정
- 최소한의 비용으로 모든집을 연결해야한다 => 최소 신장 트리문제 - 임의의 두 집에 대하여 가로등이 켜진 도로만으로도 오갈 수 있도록 -> 최소 신장 트리 문제 의심해야한다 - 왕래할 수 있다는 것은, 그래프에서 각 노드가 서로 연결되어 있다는 의미와 같기 때문이다 - 크루스칼 알고리즘 - 구하는 것은 절약할 수 있는 최대 금액 이므로 전체 가로등 켜는 비용 - 최소 신장 트리 비용 |
2. 풀이방법
1. 크루스칼
#어두운 길
#
import sys
sys.stdin = open("input.txt","r")
n,m=map(int,input().split())
parent=[0]*(n+1)
for i in range(1,n+1):
parent[i]=i
edges=[]
result=0
for _ in range(m):
x,y,z=map(int,input().split())
#비용순으로 정렬
edges.append((z,x,y))
edges.sort()
total=0 #전체비용
def find_parent(parent,x):
if parent[x]!=x:
parent[x]=find_parent(parent,parent[x])
return parent[x]
def union_parent(parent,a,b):
a=find_parent(parent,a)
b=find_parent(parent,b)
if a<b:
parent[b]=a
else:
parent[a]=b
for edge in edges:
cost,a,b=edge
total+=cost
#사이클이 발생하지 않는 경우에만 집합에 포함
if find_parent(parent,a)!=find_parent(parent,b):
union_parent(parent,a,b)
result+=cost
print(total-result)
3. 오답원인
4. 알게된 점
크루스칼 알고리즘
1. 간선 데이터를 비용에 따라 오름차순으로 정렬한다
2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인한다
2-1. 사이클이 발생하지 않는 경우 최소 신장 트리에 포함
2-2. 사이클이 발생하는 경우 최소 신장 트리에 포함 시키지 않는다
3. 모든 간선에 대해서 2번 과정을 반복한다
'PS > This' 카테고리의 다른 글
[Kakao] 자물쇠와 열쇠 (0) | 2020.08.26 |
---|---|
이것이 취업을 위한 코딩테스트다 with 파이썬 | 나동빈 (0) | 2020.08.20 |
여행 계획 (0) | 2020.08.19 |
못생긴 수 (0) | 2020.08.17 |
편집 거리 (0) | 2020.08.17 |
Comments