카테고리 없음
[Java] 백준 - 1504번: 특정한 최단 경로
C0MPAS
2024. 6. 21. 22:00
6월 21일(금) - 그래프와 순회(1504번)
https://www.acmicpc.net/problem/1504
최초 생각 정리
문제점
풀이
(풀이참고 -> https://steady-coding.tistory.com/82)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Node implements Comparable<Node>{
int end;
int weight;
Node(int end, int weight){
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Node o){
return weight - o.weight;
}
}
public class Main {
static int N,E,v1,v2;
static int[] dist;
static boolean[] visited;
static List<List<Node>> nodelist = new ArrayList<>();
static int INF = 200000000;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
E = Integer.parseInt(st.nextToken());
dist = new int[N+1];
visited = new boolean[N+1];
for(int i=0; i<=N; i++)
{
nodelist.add(new ArrayList<>());
}
for(int i=0; i<E; i++)
{
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
nodelist.get(start).add(new Node(end, weight));
nodelist.get(end).add(new Node(start, weight));
}
st = new StringTokenizer(br.readLine());
v1 = Integer.parseInt(st.nextToken());
v2 = Integer.parseInt(st.nextToken());
int res1 = 0;
res1 = res1 + dijkstra(1, v1);
res1 = res1 + dijkstra(v1, v2);
res1 = res1 + dijkstra(v2, N);
int res2 = 0;
res2 = res2 + dijkstra(1, v2);
res2 = res2 + dijkstra(v2, v1);
res2 = res2 + dijkstra(v1, N);
int min_length = (res1 >= INF && res2 >= INF) ? -1 : Math.min(res1, res2);
System.out.println(min_length);
}
public static int dijkstra(int start, int end){
Arrays.fill(dist, INF);
Arrays.fill(visited, false);
PriorityQueue<Node> pq = new PriorityQueue<>();
boolean[] visited = new boolean[N+1];
pq.add(new Node(start, 0));
dist[start] = 0;
while (!pq.isEmpty())
{
Node cur_node = pq.poll();
int cur = cur_node.end;
if(!visited[cur])
{
visited[cur] = true;
for(Node node : nodelist.get(cur))
{
if(!visited[node.end] && dist[node.end] > dist[cur] + node.weight)
{
dist[node.end] = dist[cur] + node.weight;
pq.add(new Node(node.end, dist[node.end]));
}
}
}
}
return dist[end];
}
}