Lewis's Tech Keep
[백준] 최단경로 본문
참고 : 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
- 다익스트라
- 기본 다익스트라 구현 문제와 같음. bfs + adj 리스트 구현 잘 생각할 것.
더보기
import java.util.*;
class Edge implements Comparable<Edge> {
int vertex;
int weight;
public Edge(int vertex, int weight) {
this.vertex = vertex;
this.weight = weight;
}
public int compareTo(Edge n) {
return weight - n.weight;
}
}
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int V = sc.nextInt();
int E = sc.nextInt();
int K = sc.nextInt();
int[] d = new int[V+1];
Arrays.fill(d, 100_000_000);
List<Edge>[] adj = new ArrayList[V+1];
for (int i = 0; i < V+1; i++) {
adj[i] = new ArrayList<>();
}
for (int i = 0; i < E; i++) {
int V1 = sc.nextInt();
int V2 = sc.nextInt();
int weight = sc.nextInt();
adj[V1].add(new Edge(V2, weight));
}
d[K] = 0; // K = start
boolean[] visited = new boolean[V+1];
PriorityQueue<Edge> pq = new PriorityQueue<Edge>();
pq.offer(new Edge(K , 0));
while(!pq.isEmpty()) {
Edge edge = pq.poll();
if(visited[edge.vertex]) continue;
visited[edge.vertex] = true;
for(int i = 0; i< adj[edge.vertex].size(); i++) {
Edge tmp = adj[edge.vertex].get(i);
if(d[tmp.vertex] > d[edge.vertex] + tmp.weight) {
d[tmp.vertex] = d[edge.vertex] + tmp.weight;
pq.add(new Edge(tmp.vertex, d[tmp.vertex]));
}
}
}
for (int i = 1; i <= V; i++) {
if (d[i] == 100_000_000) System.out.println("INF");
else System.out.println(d[i]);
}
}
}
'Java > 알고리즘' 카테고리의 다른 글
[백준] 줄세우기(2631) (0) | 2021.04.08 |
---|---|
[백준] 내려가기 (0) | 2021.04.07 |
[백준] 암호코드 (0) | 2021.04.05 |
[백준] 1,2,3 더하기 (0) | 2021.04.05 |
[백준] 동물원 (0) | 2021.04.04 |
Comments