Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 재귀함수
- PS
- 네트워크플로우
- 다이나믹프로그래밍
- 취득후기
- COSPROJAVA1급
- COSPRO
- spring
- 백준코딩테스트
- deque
- BFS
- 세그먼트트리
- 완전탐색
- 백준
- YBMCOS
- 구현
- java
- 자바PS
- 01BFS
- 우선순위큐
- dp
- GatherTown
- 알고리즘
- 이젠 골드구현도 어렵네..
- DFS
- 게더타운시작
- QUICKSTARTGUIDE
- 엘라스틱서치
- 시뮬레이션
- 다익스트라
Archives
- Today
- Total
공부공간
BOJ - 1753 ) 최단경로 본문
https://www.acmicpc.net/problem/1753
한 노드에서 모든 노드까지의 최단거리를 구할때 벨만포드 알고리즘O(간선개수 * 노드개수 ) 이나 간선이
모두 양수인경우 다익스트라O((간선개수+노드개수)log(노드개수))의 알고리즘을 사용한다.
다익스트라는 PriorityQueue를 이용하면 쉽게 구현할 수있는데, 현재 발견한경로중
최소의 간선으로 거리를 갱신한다면, 이후에 업데이트 횟수가 최소가 될것이 확실하기 때문이다.
다만, 실수할만한 부분이 많아서.. 꼼꼼하게 체크해주어야한다.
dijkstra algorithm에 관한 설명은 아래의 gif 를 멍때리고 보면된다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class 최단경로 {
public static int shortest[];
public static int max = 2147000000;
public static int n,m,start;
public static ArrayList<int []> map[];
static class node{
int s,c;
public node(int s, int c) {
this.s = s;
this.c = c;
}
}
public static void main(String[] args) throws Exception {
StringBuilder sb = new StringBuilder();
input();
dijkstra();
for(int i = 1; i <=n; i++) {
if(shortest[i]==max) sb.append("INF\n");
else sb.append(shortest[i]+"\n");
}
System.out.print(sb);
}
public static void dijkstra() {
PriorityQueue<node> pq = new PriorityQueue<node>(new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
return o1.c-o2.c;
}
});
shortest[start] = 0;
pq.add(new node(start , 0));
while(!pq.isEmpty()) {
node now = pq.poll();
int nowpos = now.s;
int cost = now.c;
if(shortest[nowpos] < cost) continue;
int size = map[nowpos].size();
for(int i = 0 ; i < size ; i++) {
// i 부터 갈수있는 모든 경로를 비교해보자.
int nextpos = map[nowpos].get(i)[0];
int nextcost = map[nowpos].get(i)[1];
if(shortest[nextpos] > shortest[nowpos] +nextcost) {
shortest[nextpos] = shortest[nowpos] +nextcost;
pq.add(new node(nextpos , shortest[nowpos] +nextcost));
}
}
}
}
public static void input() throws Exception{
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
shortest = new int[n+1];
map = new ArrayList[n+1]; for(int i = 1 ; i <= n; i++) {shortest[i] = max; map[i] = new ArrayList<int []>();}
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
for(int i = 0 ; i < m ; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
map[s].add(new int[]{e,c});
}
}
}
문제에서 최대 노드개수가 20000개 이므로 인접행렬로 접근했다가는
4*20000^2 대략 맵만 1.5GB를 먹는신기한 현상을 볼것이다..
무조건 인접리스트로풀어야한다.
'알고리즘 > Dijkstra' 카테고리의 다른 글
BOJ - 10282 ) 해킹 (0) | 2020.10.30 |
---|---|
BOJ - 1167 ) 트리의 지름 (0) | 2020.10.25 |
BOJ - 1504 ) 특정한 최단 경로 (0) | 2020.08.24 |
BOJ - 1261 ) 알고스팟 (0) | 2020.04.16 |
BOJ - 1916 ) 최소비용 구하기 (0) | 2020.04.16 |
Comments