[최단 경로] 문제로 이해하는 dijkstra algorithm

2023. 8. 10. 21:01·Computer Science/Algorithms

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

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

 

 

import collections
import sys
from heapq import heappop, heappush
si = sys.stdin.readline
INF = float('inf') 

n,m,x = map(int,si().split())
graph = [[] for _ in range(n+1)]

for _ in range(m) :
    u,v,w = map(int, si().split())
    # u에서 v로 갈때 드는 비용 w
    graph[u].append((v,w))

def dijkstra(start) :
    q = []
    heappush(q, (0, start))
    distance[start] = 0 # 시작점 초기화
    while q :
        # 가장 최단 거리인 노드까지의 비용, 현재 노드
        dist, now = heappop(q)
        if distance[now] != dist : continue
        for node in graph[now] :
            # cost = 현재 위치의 비용 + 이동할 노드의 비용
            cost = dist + node[1]
             # 현재 위치의 비용 + 이동할 노드의 비용 < 이동할 노드의 위치가 기존에 갖고 있던 비용
            if cost < distance[node[0]] :
                distance[node[0]] = cost
                heappush(q, (cost, node[0]))

# 1000ms
distance = [INF] * (n + 1)
res = collections.defaultdict(int)
dijkstra(x)
for i in range(1,n+1) :
    if i == x : continue
    res[i] += distance[i]

for i in range(1,n+1) :
    if i == x : continue
    distance = [INF] * (n + 1)
    dijkstra(i)
    res[i] += distance[x]

print(max(res.values()))

''' 1900ms
res = 0
for i in range(1,n+1) :
    go = dijkstra(i)
    back = dijkstra(x)
    res = max(res, go[x] + back[i])
'''

 

'Computer Science/Algorithms' 카테고리의 다른 글
  • [링크드 리스트] 링크드 리스트 뒤집기
  • [MST] BOJ 1197번: 최소 스패닝 트리
  • [위상 정렬] 문제로 이해하는 topology sort
  • Floyd's tortoise and hare algorithm
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인덱서블 타입
    컨테이너
    TypeScript
    구간합
    백준
    인덱스 시그니처
    interface
    python
    티스토리챌린지
    세그먼트 트리
    타입스크립트
    Bucket
    알고리즘
    삼성기출
    누적합
    도커
    점 업데이트
    docker
    CORS
    PrefixSum
    S3
    오프라인 쿼리
    imos법
    segment tree
    인터페이스
    파이썬
    AWS
    오블완
    docker image
    온라인 쿼리
    구간 업데이트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[최단 경로] 문제로 이해하는 dijkstra algorithm
상단으로

티스토리툴바