김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • KMU_WINK
  • 원격저장소
  • 깃허브데스크탑
  • Remote저장소
  • local저장소
  • ㄱ
  • 로컬저장소
  • GitHubDesktop

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준1238&파이썬] 다익스트라를 여러번 사용해서 최장 경로를 얻어보자

2023. 4. 20. 23:44

# 문제

백준 1238 파티 파이썬 풀이

 

1238번: 파티

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

www.acmicpc.net

 

# 코드

'''
  - 오고 가야함, X까지 오는건 각각 구하고, X에서 다시 원래 지점까지 가는 방법은 X로 다익스트라 한번만 돌리면 될듯
  - total_distance를 하나 만든다
    - total_distance는 X에서 N까지의 모든 경로를 미리 구해놓는다
    - 이후 N -> X로 가는 최단거리의 값을 구해서 다익스트라를 사용해서 해당 경로에 더해준다.
'''
import sys
from collections import defaultdict
import heapq

graph = defaultdict(list)
# N명 학생, M개의 단방향 도로, X번 마을
N, M, X = map(int,sys.stdin.readline().split())
# print(f"X : {X}")

for _ in range(M) :
  # a->b, weight
  a,b,w = map(int,sys.stdin.readline().split())
  graph[a].append((b,w))


### X -> N(모든 노드)로 가는 COST를 구함 ###
total_distance = [float('inf')] * (N+1)
total_distance[X] = 0
heap = list()
heapq.heappush(heap,(0,X)) # 힙에 초기값을 넣어준다.

while len(heap) != 0 :
  cur = heapq.heappop(heap) # ( sum_weight, vertex )

  if total_distance[cur[1]] < cur[0] : # 굳이 방문할 필요가 없다.
    continue

  for next in graph[cur[1]] : # ( vertex, weight )
    cost = total_distance[cur[1]] + next[1]
    if cost < total_distance[next[0]] :
      total_distance[next[0]] = cost
      heapq.heappush(heap,(cost, next[0]))

# print(f"total_distance : {total_distance}")
### --- total_distance에 경로가 저장 됨 ###


for start in range(N+1) :
  if start == X or start == 0 : # 도착지점이기 때문에 굳이 계산할 필요가 없다.
    continue

  distance = [float('inf')] * (N+1)
  distance[start] = 0
  heap = list()
  heapq.heappush(heap,(0,start))

  while len(heap) != 0 :
    cur = heapq.heappop(heap) # ( sum_weight , vertex )

    if distance[cur[1]] < cur[0] :
      continue

    for next in graph[cur[1]] : # ( vertex, weight )
      cost = distance[cur[1]] + next[1]
      if cost < distance[next[0]] :
        distance[next[0]] = cost
        heapq.heappush(heap,(cost,next[0]))

  # print(start, distance)
  total_distance[start] += distance[X]

total_distance.sort(reverse=True)
print(total_distance[1])

 

# 풀이

  • N명의 위치에서 X까지 가는 경로는 N 각각 구해야한다
  • X에서 N으로 가는 거리들은 한번에 구할 수 있다.
  • 두개를 합해서 최대값을 찾는다.
  • 시간 초과가 안난게 신기하다.
    • 다익스트라 알고리즘에서 우선순위 큐를 사용하면 시간 복잡도는 O((E+V)logV)가 됩니다. 여기서 E는 간선의 개수, V는 노드의 개수입니다. 다익스트라 알고리즘에서는 각 노드를 한 번씩 방문하고, 각 노드에서 인접한 간선을 모두 검사합니다. 이 때 우선순위 큐를 사용하면 최단 거리가 가장 짧은 노드를 빠르게 찾을 수 있기 때문에 검사해야 하는 간선의 수가 줄어들어 시간 복잡도가 감소합니다. 이렇게 우선순위 큐를 사용하면 다익스트라 알고리즘의 시간 복잡도를 효율적으로 줄일 수 있습니다.

 

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준1504&파이썬] 다익스트라에서 특정정점을 무조건 방문해야할때, 다익스트라는 시작정점으로부터 최단경로를 보장한다.  (0) 2023.04.22
[백준1261&파이썬] 가중치가 0과1뿐일때는 다익스트라 또는 0-1BFS를 활용할 수 있다.  (3) 2023.04.21
[백준11779&파이썬] 다익스트라에서 경로 추적이 필요할땐 route배열을 만들어 활용하자  (0) 2023.04.20
[백준1753&파이썬] 다익스트라 알고리즘은 한 정점에서 모든 정점까지의 최단거리를 구할 수 있다.  (0) 2023.04.19
[백준1707&파이썬] BFS를 활용하여 이분 그래프를 판별하는 방법  (1) 2023.04.18
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준1504&파이썬] 다익스트라에서 특정정점을 무조건 방문해야할때, 다익스트라는 시작정점으로부터 최단경로를 보장한다.
    • [백준1261&파이썬] 가중치가 0과1뿐일때는 다익스트라 또는 0-1BFS를 활용할 수 있다.
    • [백준11779&파이썬] 다익스트라에서 경로 추적이 필요할땐 route배열을 만들어 활용하자
    • [백준1753&파이썬] 다익스트라 알고리즘은 한 정점에서 모든 정점까지의 최단거리를 구할 수 있다.
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바