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
- 재귀함수
- 알고리즘
- java
- spring
- 백준
- YBMCOS
- deque
- DFS
- 이젠 골드구현도 어렵네..
- dp
- GatherTown
- 세그먼트트리
- COSPROJAVA1급
- 취득후기
- 다익스트라
- PS
- 다이나믹프로그래밍
- QUICKSTARTGUIDE
- 백준코딩테스트
- 01BFS
- 완전탐색
- 게더타운시작
- 구현
- 자바PS
- 네트워크플로우
- 시뮬레이션
- BFS
- COSPRO
- 우선순위큐
- 엘라스틱서치
Archives
- Today
- Total
공부공간
BOJ - 1504 ) 특정한 최단 경로 본문
https://www.acmicpc.net/problem/1504
특정한 노드 V1,V2를 꼭 지나야하기때문에
1->V1->V2->N의 경우의 수와 1->V2->V1->N의 경우의 수를 모두 구해서 비교한다음 정답을 구해야한다.
다익스트라 알고리즘만 알고있다면, 쉽게 풀리는 문제입니다.
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 특정한최단경로 {
private static int n,e;
private static int v1,v2;
private static ArrayList<int[]> map[];
private static PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// 간선이 짧은? 것들만 앞에 정렬
return o1[0] - o2[0];
}
});
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
map = new ArrayList[n+1];
for(int i = 1 ; i <= n ; i++) {map[i]= new ArrayList<>();}
for(int i = 0 ; i < e ; i ++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
map[a].add(new int[] {b,c});
map[b].add(new int[] {a,c});
}
st = new StringTokenizer(br.readLine());
v1 = Integer.parseInt(st.nextToken());
v2 = Integer.parseInt(st.nextToken());
long answer = Math.min(Dijkstra(1,v1) + Dijkstra(v1,v2) + Dijkstra(v2,n) , Dijkstra(1,v2) + Dijkstra(v2,v1) + Dijkstra(v1,n));
System.out.println(answer = answer >20000000 ? -1 : answer);
}
private static long Dijkstra(int s ,int e) {
// s에서부터 e까지의 short path값을 리턴
pq.clear();
long path[] = new long[n+1];
for(int i = 1 ; i <=n ; i++) path[i] = 2000000000;
// 자기자신은 0
path[s] =0;
pq.add(new int[] {s,0});
while(!pq.isEmpty()) {
int[] now = pq.poll();
for (int[] node : map[now[0]]) {
if(path[node[0]] > node[1]+path[now[0]]) {
path[node[0]] = node[1]+path[now[0]];
pq.add(node);
}
}
}
return path[e];
}
}
'알고리즘 > Dijkstra' 카테고리의 다른 글
BOJ - 10282 ) 해킹 (0) | 2020.10.30 |
---|---|
BOJ - 1167 ) 트리의 지름 (0) | 2020.10.25 |
BOJ - 1261 ) 알고스팟 (0) | 2020.04.16 |
BOJ - 1916 ) 최소비용 구하기 (0) | 2020.04.16 |
BOJ - 1753 ) 최단경로 (0) | 2020.04.07 |
Comments