다익스트라 예제 - 1
Last updated
Last updated
v(노드 개수) e(에지 개수)
k(시작 노드)
distance(거리 저장 리스트)
visit(방문 처리 리스트)
A(인접 리스트)
pq(우선순위 큐)
for e 반복:
인접 리스트 데이터 저장
시작 노드 우선순위 큐 삽입
거리 리스트에 시작 노드 0 설정
while 큐가 빌 때까지:
우선순위 큐에서 현재 노드 가져오기
현재 선택된 노드를 방문한 적이 있는지 확인
현재 노드를 방문 처리
for 현재 선택된 노드의 인접 노드:
if 미방문 노드 and 현재 선택 노드 최단 거리 + 비용 < 연결 노드의 최단 거리:
연결 노드 최단 거리 업데이트
우선순위 큐에 연결 노드 추가
완성된 거리 리스트 출력import sys
from queue import PriorityQueue
input = sys.stdin.readline
class Node:
def __init__(self, node, dist):
self.node = node
self.dist = dist
V, E = map(int, input().split())
k = int(input())
distance = [sys.maxsize] * (V + 1)
visit = [False] * (V + 1)
A = [[] for _ in range(V + 1)]
pq = PriorityQueue()
for _ in range(E):
u, v, w = map(int, input().split())
A[u].append(Node(v, w))
pq.put((0, k))
distance[k] = 0
while pq.qsize() > 0:
now = pq.get()
if visit[now[1]]:
continue
visit[now[1]] = True
for next in A[now[1]]:
next_node = next.node
dist = next.dist
if distance[next_node] > distance[now[1]] + dist:
distance[next_node] = distance[now[1]] + dist
pq.put((distance[next_node], next_node))
result = []
for i in range(1, V + 1):
result.append(str(distance[i]) if visit[i] else "INF")
print("\n".join(result))import org.w3c.dom.Node;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
// 인접 리스트에 저장할 노드
static class Node {
int node, dist;
public Node(int node, int dist) {
this.node = node;
this.dist = dist;
}
}
// 우선순위 큐에 value값 기준 오름차순 정렬할 정보
static class Info implements Comparable<Info> {
int value, node;
public Info(int value, int node) {
this.value = value;
this.node = node;
}
@Override
public int compareTo(Info o) {
return this.value - o.value;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(br.readLine());
boolean[] visit = new boolean[V + 1];
int[] distance = new int[V + 1];
Arrays.fill(distance, Integer.MAX_VALUE);
ArrayList<Node>[] A = new ArrayList[V + 1];
for (int i = 1; i < V + 1; i++) {
A[i] = new ArrayList<>();
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
A[u].add(new Node(v, w));
}
Queue<Info> pq = new PriorityQueue<>();
pq.add(new Info(0, K));
distance[K] = 0;
while (!pq.isEmpty()) {
Info now = pq.poll();
int cur = now.node;
if (visit[cur]) {
continue;
}
visit[cur] = true;
for (Node next : A[cur]) {
int next_node = next.node;
int dist = next.dist;
if (distance[next_node] > distance[cur] + dist) {
distance[next_node] = distance[cur] + dist;
pq.add(new Info(distance[next_node], next_node));
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < V + 1; i++) {
sb.append(visit[i] ? distance[i] : "INF").append("\n");
}
System.out.println(sb);
}
}