알고리즘 문제/백준

[백준 - Java] 1504번 : 특정한 최단 경로

건복치 2021. 3. 20. 00:00
반응형

문제

www.acmicpc.net/problem/1504

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

설명

백준 1753번 최단 경로 문제를 응용하면 되는 문제이다.

 

 

📌 다익스트라 알고리즘에 대해 더 알고싶다면 아래 포스팅을 참고해주세요!

 

[Java] 다익스트라 (Dijkstra) 최단 경로 알고리즘

전체 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
	static ArrayList<Element>[] adjList;
	static int N;
	static int INF;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
		int E = sc.nextInt();

		// 인접 리스트 구현 
		adjList = new ArrayList[N+1];
		for(int i = 1; i < N+1; i++) {
			adjList[i] = new ArrayList<>();
		}

		for(int i = 0; i < E; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			int c = sc.nextInt();

			adjList[a].add(new Element(b, c));
			adjList[b].add(new Element(a, c));
		}

		int v1 = sc.nextInt();
		int v2 = sc.nextInt();
		
		INF = 10000 * (N-1) + 1;
		
		int result1 = 0;
		int result2 = 0;
		
		// 시작 정점 1 -> v1 -> v2 -> 도착 정점 N
		result1 += dijkstra(1, v1);
		result1 += dijkstra(v1, v2);
		result1 += dijkstra(v2, N);
		

		// 시작 정점 1 -> v2 -> v1 -> 도착 정점 N
		result2 += dijkstra(1, v2);
		result2 += dijkstra(v2, v1);
		result2 += dijkstra(v1, N);
		
		int answer = Math.min(result1, result2);
		System.out.println(answer >= INF ? -1 : answer);
	}

	public static int dijkstra(int start, int end) {
		boolean[] check = new boolean[N+1];

		int[] distance = new int[N+1];
		Arrays.fill(distance, INF);
		distance[start] = 0;

		PriorityQueue<Element> pq = new PriorityQueue<>();
		pq.offer(new Element(start, 0));

		while(!pq.isEmpty()) {
			int current = pq.poll().index;

			if(check[current]) continue;

			check[current] = true;

			for(Element next : adjList[current]) {
				if(distance[next.index] > distance[current] + next.distance) {
					distance[next.index] = distance[current] + next.distance;
					pq.offer(new Element(next.index, distance[next.index]));
				}
			}
		}
		
		return distance[end];
	}

}

class Element implements Comparable<Element> {
	int index;
	int distance;

	Element(int index, int distance) {
		this.index = index;
		this.distance = distance;
	}

	@Override
	public int compareTo(Element o) {
		//return this.distance <= o.distance ? -1 : 1;
		return Integer.compare(this.distance, o.distance);

		/*
		 Integer.compare(int x, int y)
		 x == y ->  0 return 
		 x < y  ->  -1 return 
		 x > y  ->  1 return 
		 */
	}
}

GITHUB

github.com/KwonMinha/BOJ/tree/master/BOJ%231504/src

 

KwonMinha/BOJ

Baekjoon Online Judge(Java) 문제풀이. Contribute to KwonMinha/BOJ development by creating an account on GitHub.

github.com

 

반응형