2025-08-05 22:34:04 +09:00

72 lines
2.1 KiB
Java

import java.util.*;
class Node implements Comparable<Node>{
int nextNode;
int weight;
Node(int nextNode, int weight){
this.nextNode = nextNode;
this.weight = weight;
}
@Override
public int compareTo(Node other){
return this.weight - other.weight;
}
}
public class _1753{
static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] input = sc.nextLine().split(" ");
int V = Integer.parseInt(input[0]);
int E = Integer.parseInt(input[1]);
int K = Integer.parseInt(sc.nextLine());
ArrayList<ArrayList<Node>> graph = new ArrayList<>();
for (int i = 0; i <= V; i++) {
graph.add(new ArrayList<Node>());
}
for(int i=1; i<=E; i++){
String[] linkInfo = sc.nextLine().split(" ");
int u = Integer.parseInt(linkInfo[0]);
int v = Integer.parseInt(linkInfo[1]);
int w = Integer.parseInt(linkInfo[2]);
graph.get(u).add(new Node(v,w));
}
sc.close();
PriorityQueue<Node> PQ = new PriorityQueue<>();
int[] distance = new int[V+1];
Arrays.fill(distance, INF);
distance[K] = 0;
PQ.add(new Node(K, 0));
while(!PQ.isEmpty()){
Node current = PQ.poll();
int currentNode = current.nextNode;
int currentWeight = current.weight;
if (distance[currentNode] < currentWeight) {
continue;
}
for(Node next : graph.get(current.nextNode)){
int nextNode = next.nextNode;
int nextWeight = next.weight;
if(distance[nextNode] > distance[currentNode] + nextWeight){
distance[nextNode] = distance[currentNode] + nextWeight;
PQ.add(new Node(nextNode, distance[nextNode]));
}
}
}
for(int i=1; i<=V; i++){
System.out.println(distance[i]==INF ? "INF" : distance[i]);
}
}
}