백준 JAVA 1753번 최단경로
문제 링크: 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.util.*; import java.io.*; class node implements Comparable<node>{ // 우선순위 큐를 사용하기 위해 상속받는다. int end; int cost; public node(int end, int cost) { this.end = end; this.cost = cost; } @Override public int compareTo(node o) { return this.cost-o.cost; } } public class Main { static int v; static int e; static List<node>[] list; static boolean [] check; //이미 들린 정점인지 확인하는 배열 static int [] distance; // 각 정점의 값을 저장 public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s = br.readLine().split(" "); v = Integer.parseInt(s[0]); e = Integer.parseInt(s[1]); list= new ArrayList[v+1]; check= new boolean[v+1]; distance= new int[v+1]; for(int i=1; i<=v; i++){ distance[i]=Integer.MAX_VALUE; list[i]=new ArrayList<>(); } int a,b,c; int start = Integer.parseInt(br.readLine()); for(int i=0; i<e; i++){ String[] s1 = br.readLine().split(" "); a=Integer.parseInt(s1[0]); b=Integer.parseInt(s1[1]); c=Integer.parseInt(s1[2]); list[a].add(new node(b,c)); // 시작점, 도착점, 가중치를 저장한다. } dij(start); StringBuilder sb = new StringBuilder(); for(int i=1; i<=v; i++){ if(distance[i]==Integer.MAX_VALUE){ sb.append("INF").append("\n"); continue; } sb.append(distance[i]).append("\n"); } System.out.println(sb.toString()); } public static void dij(int start){ distance[start]=0; PriorityQueue<node> queue = new PriorityQueue<>(); queue.add(new node(start,0)); while (!queue.isEmpty()){ node poll = queue.poll(); check[poll.end]=true; for (node now: list[poll.end]){ if(!check[now.end]){ if(distance[poll.end]+now.cost<distance[now.end]){ // 다음 가중치 + 현재의 가중치 < 이미 저장된 가중치라면 바꿔주고 큐에 넣어준다. distance[now.end]=distance[poll.end]+now.cost; queue.add(new node(now.end, distance[now.end])); } } } } } }

'Alogorithm > 최단 경로' 카테고리의 다른 글
백준 1446[자바] java 지름길 (0) | 2022.05.19 |
---|---|
백준 2224 [자바] java 명제 증명 (0) | 2022.01.31 |
백준 1719 [자바] java 택배 (0) | 2022.01.14 |
백준 14938 [자바] java 서강그라운드 (0) | 2022.01.08 |
백준 JAVA 11657번 타임머신 (0) | 2021.12.19 |
댓글
이 글 공유하기
다른 글
-
백준 2224 [자바] java 명제 증명
백준 2224 [자바] java 명제 증명
2022.01.31 -
백준 1719 [자바] java 택배
백준 1719 [자바] java 택배
2022.01.14 -
백준 14938 [자바] java 서강그라운드
백준 14938 [자바] java 서강그라운드
2022.01.08 -
백준 JAVA 11657번 타임머신
백준 JAVA 11657번 타임머신
2021.12.19
댓글을 사용할 수 없습니다.