본문 바로가기
문제 해결/BOJ

[백준] 군사 이동

by 자잘 2023. 2. 5.

https://www.acmicpc.net/problem/11085

 

11085번: 군사 이동

전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여

www.acmicpc.net

 

경로에 존재하는 가장 넓은 너비를 구하는 것이 목적인 문제입니다. 지나갈 수 있는 최소 너비를 지정해주고 이보다 큰 간선만을 택하면서 다익스트라를 수행한 다음 목적지에 도달할 수 있는지를 체크하면  풀 수 있습니다. 

 

# 문제링크: https://www.acmicpc.net/problem/11085
import sys, os, heapq
from collections import defaultdict

# sys.stdin = open(os.curdir + "\\input.txt", "r")
input = sys.stdin.readline
INT_MAX = sys.maxsize

# p개의 노드, w개의 간선
p, w = tuple(map(int, input().split()))

# c: 시작점, v: 도착점
c, v = tuple(map(int, input().split()))

graph = defaultdict(list)

# 그래프 구성
for _ in range(w):
    start, end, weight = tuple(map(int, input().split()))
    graph[start].append((end, weight))
    graph[end].append((start, weight))

def dijkstra(start, end, min_weight):
    dist = [INT_MAX] * p
    dist[start] = 0

    q = [(0, start)]

    while q:
        cur_dist, cur_node = heapq.heappop(q)

        for next_node, next_weight in graph[cur_node]:
            # 최소 간선의 가중치보다 큰 간선에 대해서만 다익스트라를 진행
            if next_weight >= min_weight:
                next_dist = cur_dist + next_weight

                if next_dist < dist[next_node]:
                    dist[next_node] = next_dist

                    heapq.heappush(q, (next_dist, next_node))

    return True if dist[end] != INT_MAX else False

answer = 0

# 지나갈 수 있는 최소 간선의 가중치를 정해두고 이보다 큰 간선만 택하여 경로를 찾을 수 있는지 확인
for min_weight in range(1000, -1, -1):
    if dijkstra(c, v, min_weight):
        answer = min_weight
        break

print(answer)

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 두 배 더하기  (0) 2023.02.06
[백준] 숨바꼭질 4  (0) 2023.02.06
[백준] 트리의 지름  (0) 2023.02.04
[백준] 낚시왕  (0) 2023.02.03
[백준] 물대기  (0) 2023.02.03