-
[백준] 21278번: 호석이 두마리 치킨(Python, 플로이드워셜)Algorithm PS👩🏻💻/백준 2024. 3. 20. 15:32
문제링크
https://www.acmicpc.net/problem/21278
21278번: 호석이 두 마리 치킨
위의 그림과 같이 1번과 2번 건물에 치킨집을 짓게 되면 1번부터 5번 건물에 대해 치킨집까지의 왕복 시간이 0, 0, 2, 2, 2 로 최소가 된다. 2번과 3번 건물에 지어도 동일한 왕복 시간이 나오지만 더
www.acmicpc.net
풀이
- combinations로만 풀기엔 시간초과가 나는게 뻔해서 고민했다. 완전 탐색 문제인데 어떻게 다 돌지?
- 질문게시판에 플로이드 워셜로 하면 금방 다그래서 봤더니 진짜 금방이다:)
- 모든 지점 -> 모든 지점은 플로이드워셜, 최단 경로 알고리즘으로만 생각했는데 완전 탐색도 포함이니까 잊지말자!
from itertools import combinations import sys input = sys.stdin.readline INF = 10e9 N, M = map(int, input().split()) graph = [[INF] * (N + 1) for _ in range(N + 1)] for i in range(N + 1): for j in range(N + 1): if i == j: graph[i][j] = 0 for _ in range(M): a, b = map(int, input().split()) graph[a][b] = 1 graph[b][a] = 1 # 플로이드워셜 for k in range(N + 1): for i in range(N + 1): for j in range(N + 1): graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]) cities = [i for i in range(1, N + 1)]# 조합으로 2개씩 뽑아놓은것 만들기 chickens = list(combinations(cities, 2)) # 각 도시별로 2개 치킨집에 대한 최소 거리를 저장한다 result = (10e9, 1, 2) for chicken in chickens: a, b = chicken temp = 0 for city in cities: temp += min(graph[city][a], graph[city][b]) if result > (temp, a, b): result = (temp, a, b) print(result[1], result[2], result[0] * 2)
'Algorithm PS👩🏻💻 > 백준' 카테고리의 다른 글
[백준] 2138번: 전구와 스위치(Python, 그리디) (0) 2024.04.02 [백준] 15732번: 도토리 숨기기(Pyhton, 이진 탐색) (0) 2024.03.21 [백준] 20056번: 마법사 상어와 파이어볼(구현, Python) (1) 2023.10.08 [백준] 5639번: 이진검색트리(Python) (0) 2023.08.11 [백준] 9935번: 문자열 폭발(Python) (0) 2023.08.11