estherseo
JINIWAY
estherseo
전체 방문자
오늘
어제
  • 분류 전체보기
    • 전공공부
    • CS
      • Network
      • Algorithm
      • 📖
      • python
      • django
    • Pentest
      • 📖
      • HTB
      • Machines
    • Web-hacking
      • 📖
      • Dreamhack
      • Portswigger
    • System-hacking
      • 📖
    • Mobile-hacking
    • Project
    • CVE
    • CTF
    • News & Conference
    • 자격증
    • 신기술
      • AI

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 블로그 소개

인기 글

최근 댓글

최근 글

태그

  • Pillow취약점
  • 2022 pox
  • shocker
  • 화이트햇투게더1기
  • 다크웹 모니터링
  • 세계신안보포럼
  • 화이트햇투게더1기 결과공유회
  • 네트워크관리사 실기 합격
  • 시스템해킹 스터디
  • python eval
  • CVE-2022-22817
  • ASC스터디
  • jwt token last character
  • 스택카나리
  • pox2022
  • HTB valentine
  • ASC 스터디
  • 기사요약
  • integer overflow
  • n00bCTF
  • 시스템해킹공부
  • 패킷잡기
  • 다크웹 모니터링 서비스
  • asc
  • 2022 네트워크관리사
  • HTB shocker
  • 셸쇼크
  • 중소기업 정보보호
  • CTF공부
  • 화이트햇투게더
hELLO · Designed By 정상우.
estherseo

JINIWAY

CS/Algorithm

[Algorithm][다익스트라]

2024. 7. 2. 20:41

 

"""
시간복잡도 :
최단 거리 테이블에서 가장 짧은 거리의 노드를 매번 탐색.
해당 노드와 연결된 노드를 또 탐색.
=> V = 노드의 개수, O(V^2)

* 노드의 개수가 만개 이상이라면, 다른 개선된 알고리즘을 사용해야 한다. 


"""

import sys
input = sys.stdin.readline
INF = int(1e9)

n, m = map(int, input().split())
start = int(input())
graph = [[] for _ in range(n+1)]
visited = [False] * (n+1)
distance = [INF] * (n+1)

for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a].append((b,c))

# 최단 거리 테이블(distance)에서 거리가 가장 짧은 노드 탐색
def get_smallest_node():
    min_val = INF
    index = 0
    for i in range(1, n+1):
        if distance[i] < min_val and not visited[i]:
            min_val = distance[i]
            index = i
    return index

def dijkstra(start):
    distance[start]=0
    visited[start]=True
    for b,c in graph[start]:
        distance[b]=c
    
    for _ in range(n-1):
        now = get_smallest_node()
        visited[now]=True
        for b,c in graph[now]:
            distance[b]=min(distance[b], distance[now]+c)

dijkstra(start)

for i in range(1, n+1):
    if distance[i]==INF:
        print("INF")
    else:
        print(distance[i])

 

 

+ 개선 : 우선순위 큐

"""
우선순위 큐를 이용하여 시간복잡도 개선!

1. 노드 선택 및 큐 삽입/제거 : O(V logV)
2. 간선 처리 및 거리 갱신 : O(E logV)
=> O((V+E)logV) 

* 최악의 경우
E가 V보다 클 때, O(E log V)로 간주할 수 있다.

"""

import sys
import heapq ##우선순위 큐
input = sys.stdin.readline
INF = int(1e9)

n, m = map(int, input().split())
start = int(input())
graph = [[] for _ in range(n+1)]
#(제거) visited = [False] * (n+1)
distance = [INF] * (n+1)

for _ in range(m):
    a, b, c = map(int, input().split())
    graph[a].append((b,c))

# 최단 거리 테이블(distance)에서 거리가 가장 짧은 노드 탐색 #### 개선!
def dijkstra(start):
    q = []
    heapq.heappush(q, (0, start))
    distance[start]=0
    while q:
        dist, now = heapq.heappop(q) # 우선순위 큐 : 가장 작은 거 pop => 시간복잡도 O(logV)
        if distance[now] < dist: #### 이미 처리된 적이 있다면 넘어감
            continue 

        for b,c in graph[now]: # 간선의 개수 E => 시간복잡도 O(E)
            cost = dist + c
            if cost < distance[b]:
                distance[b] = cost
                heapq.heappush(q, (cost, b)) # => 시간복잡도 O(log V)

dijkstra(start)

for i in range(1, n+1):
    if distance[i]==INF:
        print("INF")
    else:
        print(distance[i])

'CS > Algorithm' 카테고리의 다른 글

[Algorithm][벨만포드] 백준 11657 : 타임머신  (0) 2024.07.03
[Algorithm] 이코테 : 두 배열의 원소 교체  (1) 2024.06.30
[Algorithm] 선택정렬, 삽입정렬, 계수정렬  (0) 2024.06.30
[Algorithm][이진탐색] 백준 1920 : 수찾기  (0) 2024.06.29
[Algorithm][dfs, bfs] 백준 1260 : dfs와 bfs  (0) 2024.06.28
    'CS/Algorithm' 카테고리의 다른 글
    • [Algorithm][벨만포드] 백준 11657 : 타임머신
    • [Algorithm] 이코테 : 두 배열의 원소 교체
    • [Algorithm] 선택정렬, 삽입정렬, 계수정렬
    • [Algorithm][이진탐색] 백준 1920 : 수찾기
    estherseo
    estherseo
    안녕하세요😀

    티스토리툴바