728x90
https://www.acmicpc.net/problem/13911
728x90
메모리: 136,536 KB , 시간: 888 ms
사용 알고리즘: 데이크스트라, 그래프 이론, 최단 경로
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int MAX_LEN = 100_000_001;
static int V;
static ArrayList<ArrayList<int[]>> edges;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
// 비용 0으로 모든 맥도날드에 갈 수 있는 가상의 맥도날드 점정 V + 1과
// 비용 0으로 모든 스타벅스에 갈 수 있는 가상의 스타벅스 점정 V + 2 추가
// V + 1에서 출발하는 다익스트라를 사용하여 모든 정점에 대해 맥도날드로 가는 최소값을 구할 수 있음.
// V + 2에서 출발하는 다익스트라를 사용하여 모든 정점에 대해 스타벅스로 가는 최소값을 구할 수 있음.
edges = new ArrayList<>();
for (int i = 0; i < V + 3; i++) {
edges.add(new ArrayList<>());
}
int u, v, w;
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
edges.get(u).add(new int[] {v, w});
edges.get(v).add(new int[] {u, w});
}
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int tmp;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
tmp = Integer.parseInt(st.nextToken());
edges.get(V + 1).add(new int[] {tmp, 0});
}
st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
for (int i = 0; i < S; i++) {
tmp = Integer.parseInt(st.nextToken());
edges.get(V + 2).add(new int[] {tmp, 0});
}
int[] macLen = dijkstra(V + 1);
int[] starLen = dijkstra(V + 2);
int result = -1;
for (int i = 1; i <= V; i++) {
if(macLen[i] != 0 && macLen[i] <= x && starLen[i] != 0 && starLen[i] <= y) {
if(result == -1) result = macLen[i] + starLen[i];
else result = Math.min(result, macLen[i] + starLen[i]);
}
}
System.out.println(result);
}
private static int[] dijkstra(int start) {
int[] visited = new int[V + 3];
Arrays.fill(visited, MAX_LEN);
visited[start] = 0;
Queue<int[]> q = new LinkedList<>();
q.add(new int[] {start, 0});
int[] now, next;
ArrayList<int[]> edge;
while(!q.isEmpty()) {
now = q.poll();
if(visited[now[0]] < now[1]) continue;
edge = edges.get(now[0]);
for (int i = 0; i < edge.size(); i++) {
next = edge.get(i);
if(visited[next[0]] > now[1] + next[1]) {
visited[next[0]] = now[1] + next[1];
q.add(new int[] {next[0], visited[next[0]]});
}
}
}
return visited;
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 9466] 텀 프로젝트 (java) (0) | 2024.05.09 |
---|---|
[백준, BOJ 1045] 도로 (java) (0) | 2024.05.08 |
[백준, BOJ 2228] 구간 나누기 (java) (0) | 2024.05.02 |
[백준, BOJ 1561] 놀이 공원 (java) (0) | 2024.05.02 |
[백준, BOJ 2624] 동전 바꿔주기 (java) (0) | 2024.04.30 |