728x90
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_BJ_1753_최단경로 {
static ArrayList<node>[] graph;
static int vNum;
static class node{
int v;
int w;
public node(int v, int w) {
this.v = v;
this.w = w;
}
}
public static void main(String[] args) throws Exception{
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
vNum = Integer.parseInt(st.nextToken()); // 정점 개수
int eNum = Integer.parseInt(st.nextToken()); // 간선 개수
int k = Integer.parseInt(br.readLine()); // 시작 정점 번호
graph = new ArrayList[vNum+1];
for(int i=1; i<=vNum; i++)
graph[i] = new ArrayList<>();
for(int i=0; i<eNum; i++){
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken()); // start
int v = Integer.parseInt(st.nextToken()); // end
int w = Integer.parseInt(st.nextToken()); // weight
graph[u].add(new node(v, w));
}
dijkstra(k);
}//main
private static void dijkstra(int k){
PriorityQueue<node> pq = new PriorityQueue<>(new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
return o1.w - o2.w;
}
}); // 가중치 합 기준으로 정렬
int[] dist = new int[vNum+1];
// 최소 거리 정보 답을 배열 => 최대값으로 초기화
for(int i=1; i<=vNum; i++)
dist[i] = Integer.MAX_VALUE;
pq.offer(new node(k, 0));
// 시작 지점은 거리 0
dist[k] = 0;
while(!pq.isEmpty()){
node cur = pq.poll();
if(dist[cur.v] < cur.w)
continue;
for(int i=0; i<graph[cur.v].size(); i++){
node next = graph[cur.v].get(i);
if(dist[next.v] > cur.w+next.w){
dist[next.v] = cur.w+next.w;
pq.offer(new node(next.v, dist[next.v]));
}
}
}//while
for(int i=1; i<=vNum; i++){
if(dist[i] == Integer.MAX_VALUE)
System.out.println("INF");
else
System.out.println(dist[i]);
}
}//dijkstra
}
대놓고 다익스트라로 풀라는 문제. 그런데 까먹어서 개념정립이 시급...
https://sskl660.tistory.com/59
[Java]다익스트라 알고리즘(Dijkstra Algorithm)
*다익스트라 알고리즘(Dijkstra Algorithm) -> 다익스트라 알고리즘은 음의 가중치(음의 간선, 음의 값)가 없는 그래프의 한 노드에서 각 모든 노드까지의 최단거리를 구하는 알고리즘을 말한다. -> 초
sskl660.tistory.com
많이 참고한 블로그!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 15650 N과 M(2) (JAVA) (0) | 2023.03.02 |
---|---|
백준 2609 최대공약수와 최소공배수(JAVA) (0) | 2023.03.02 |
백준 11053 가장 긴 증가하는 부분 수열(JAVA) (0) | 2023.02.21 |
백준 1991 트리 순회(JAVA) (0) | 2023.02.20 |
백준 6064 카잉 달력(JAVA) (0) | 2023.02.17 |