728x90
반응형
1. 문제
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
2. 풀이
3. 코드
import java.io.*;
import java.util.*;
public class Main {
static class Edge implements Comparable<Edge> {
int to, weight;
public Edge(int to, int weight) {
this.to = to;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.weight, o.weight);
}
}
static final int INF = 200000000;
static PriorityQueue<Edge> pq;
static ArrayList<ArrayList<Edge>> list = new ArrayList<>();
static int[] visited;
static boolean[] check;
static int N, M, start, end;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// br = new BufferedReader(new StringReader(src));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 정점
M = Integer.parseInt(st.nextToken()); // 간선
visited = new int[N + 1];
check = new boolean[N + 1];
Arrays.fill(visited, INF);
for (int i = 0; i <= N; i++) {
list.add(new ArrayList<>());
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
list.get(from).add(new Edge(to, weight));
list.get(to).add(new Edge(from, weight));
}
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int result1 = 0;
result1 += dijkstra(1, v1);
result1 += dijkstra(v1, v2);
result1 += dijkstra(v2, N);
int result2 = 0;
result2 += dijkstra(1, v2);
result2 += dijkstra(v2, v1);
result2 += dijkstra(v1, N);
int result = Math.min(result1, result2);
if (result >= INF)
System.out.println(-1);
else
System.out.println(result);
}
public static int dijkstra(int start, int end) {
Arrays.fill(visited, INF);
Arrays.fill(check, false);
pq = new PriorityQueue<>();
visited[start] = 0;
pq.offer(new Edge(start, 0));
while (!pq.isEmpty()) {
Edge now = pq.poll();
if (!check[now.to]) {
check[now.to] = true;
for (Edge next : list.get(now.to)) {
if (!check[next.to] && visited[next.to] > visited[now.to] + next.weight) {
visited[next.to] = visited[now.to] + next.weight;
pq.offer(new Edge(next.to, visited[next.to]));
}
}
}
}
return visited[end];
}
static String src =
"4 6\r\n"
+ "1 2 3\r\n"
+ "2 3 3\r\n"
+ "3 4 1\r\n"
+ "1 3 5\r\n"
+ "2 4 5\r\n"
+ "1 4 4\r\n"
+ "2 3";
}
반응형
반응형
'알고리즘 > 그래프' 카테고리의 다른 글
| [백준 6087] 레이저 통신(Java) (0) | 2020.12.28 |
|---|---|
| [백준 1963] 소수 경로(Java) (0) | 2020.12.23 |
| [백준 16929] Two Dots(Java) (0) | 2020.12.22 |
| [백준 13023] ABCDE(Java) (0) | 2020.12.22 |
| [백준 11724] 연결 요소의 개수(Java) (0) | 2020.12.22 |