백준/ Gold 3 문제 , 백준 파이썬 1833 , 고속철도 설계하기 [최소 스패닝 트리, 프림 알고리즘]
풀이 시간
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
기존에 깔린 고속도로를 우선적으로 탐색하고, 기존 고속도로 전체를 비용에 모두 추가 시켜야한다.
문제 출처
https://www.acmicpc.net/problem/1833
풀이
1. 입력 받은 행렬 처리
그래프에는 가중치와 연결된 노드 , 기존 고속도로인지 새로 까는건지, 연결 시킨 노드 이렇게 저장한다.
0은 기존에 있는 고속도로
1은 새로 까는 고속도로 라는 표시를 해주었다.
연결 시키는 노드를 따로 또 저장하는 이유는 나중에 출력할때 편하게 하기 위함이다.
그리고 total 이라는 변수에 기존 고속도로 비용을 모두 저장시킨다.
이 값과 나중에 새로까는 고속도로 비용을 합해서 출력할 것이다.
그리고 처음에 기존 고속도로일경우 음수를 양수로 바꿔서 저장했었는데 이렇게 되면 기존 고속도로를 우선적으로 탐색하지 않는다.
우리가 최소화 하려는 것은 C이다.
문제에 명시된 이 문구가 요구하는 것은 결국 기존 고속도로를 최대한 이용하자는 것이므로 음수 그대로 저장시킨다.
2. 결과값 출력
기존 고속도로 비용은 total 이라는 변수에 따로 저장했으므로 C==1 인 것들만 확인해서 비용을 저장시킨다.
이후 아까 같이 넣어주었던 연결된 노드와 연결시킨 노드를 answer 리스트에 저장시킨다.
이 모든 과정이 끝나면 total과 result 를 합해 고속도로를 만드는데 든 총 비용과 새로 연결 시킨 고속도로 갯수를 출력하고
그 고속도로들을 행마다 출력시켜주면 된다.
정답
import heapq
import sys
input=sys.stdin.readline
N=int(input())
matrix=[]
for i in range(N):
matrix.append(list(map(int,input().split())))
graph=[[] for _ in range(N+1)]
total=0
for i in range(N):
for j in range(i+1,N):
tmp=matrix[i][j]
if tmp<0:
graph[i+1].append((tmp,j+1,0,i+1))
graph[j+1].append((tmp,i+1,0,j+1))
total+=(-tmp)
else:
graph[i+1].append((tmp,j+1,1,i+1))
graph[j+1].append((tmp,i+1,1,j+1))
visited=[True,True]+[False]*(N-1)
q=graph[1]
heapq.heapify(q)
result=0
answer=[]
while q:
Z,X,C,D=heapq.heappop(q)
if not visited[X]:
if C==1:
result+=Z
answer.append([D,X])
visited[X]=True
for i in graph[X]:
if not visited[i[1]]:
heapq.heappush(q,i)
print(total+result,len(answer))
for i in range(len(answer)):
print(*answer[i])
반응형
'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글
백준/ Gold 2 문제 , 백준 파이썬 10423 , 전기가 부족해 [최소 스패닝 트리, 프림 알고리즘] (0) | 2022.08.24 |
---|---|
백준/ Gold 3 문제 , 백준 파이썬 1368 , 물대기 [최소 스패닝 트리, 프림 알고리즘] (0) | 2022.08.23 |
백준/ Gold 4 문제 , 백준 파이썬 6497 , 전력난 [최소 스패닝 트리, 프림 알고리즘] (0) | 2022.08.22 |
백준/ Gold 3 문제 , 백준 파이썬 16202 , MST 게임 [최소 스패닝 트리, 프림 알고리즘] (0) | 2022.08.22 |
백준/ Gold 4 문제 , 백준 파이썬 21924 , 도시 건설 [최소 스패닝 트리, 프림 알고리즘] (0) | 2022.08.22 |