1504. 특정한 최단경로 (Java)

2023. 10. 31. 13:35·Algorithm & Data Structures/BOJ

전형적인 데이크 스트라 (다익스트라) 문제
출발지에서 경유지1 

경유지1에서 경유지2

경유지2에서 도착지 의 다익스트라 결과값의 합과

출발지에서 경유지2

경유지2에서 경유지1

경유지1에서 도착지 의 다익스트라 결과값의 합중

최솟값을 비교하여 풀어보았다.

package algorithm.src.minho;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Node implements Comparable<Node>{
	int end;
	int val;
	
	public Node(int end, int val) {
		super();
		this.end = end;
		this.val = val;
	}

	@Override
	public int compareTo(Node o) {
		return this.val-o.val;
	}
	
}
public class Main {
	
	static int N, E ,x,y;
	static ArrayList<Node>[] list;
	static boolean[] isVisited;
	static int[] dist;
	static int INF = 20000001;
	
	public static int Dijkstra(int a, int b) {
		isVisited = new boolean[N+1];
		Arrays.fill(dist, INF);
		PriorityQueue<Node> pq = new PriorityQueue<>();
		pq.add(new Node(a,0));
		dist[a]=0;
		while(!pq.isEmpty()) {
			Node now = pq.poll();
			if(isVisited[now.end]) continue;
			for(int i = 0 ; i < list[now.end].size() ; i++) {
				int v = dist[now.end]+list[now.end].get(i).val;
				if(v < dist[list[now.end].get(i).end]) {
					dist[list[now.end].get(i).end] = v;
					pq.offer(new Node(list[now.end].get(i).end,v));
				}
			}
		}
		return dist[b];
	}
	
	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());
		
		list = new ArrayList[N+1];
		for(int i = 1 ; i <= N ; i++) {
			list[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());
			
			list[a].add(new Node(b,c));
			list[b].add(new Node(a,c));
		}
		st = new StringTokenizer(br.readLine());
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		
		dist = new int[N+1];
		int res1 = Dijkstra(1,x) +Dijkstra(x,y) +Dijkstra(y,N);
		int res2 = Dijkstra(1,y) +Dijkstra(y,x) +Dijkstra(x,N);
		
		if(Math.min(res1, res2)<20000001) {
			System.out.println(Math.min(res1, res2));
		}else {
			System.out.println(-1);
		}
	}
}

'Algorithm & Data Structures > BOJ' 카테고리의 다른 글

17396. 백도어 (Java)  (0) 2023.11.03
14284. 간선이어가기2 (Java)  (1) 2023.11.01
2294. 동전2 (Java)  (0) 2023.10.30
1238. 파티 (Java)  (0) 2023.10.24
5972. 택배배송(Java)  (1) 2023.10.23
'Algorithm & Data Structures/BOJ' 카테고리의 다른 글
  • 17396. 백도어 (Java)
  • 14284. 간선이어가기2 (Java)
  • 2294. 동전2 (Java)
  • 1238. 파티 (Java)
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (326)
      • Algorithm & Data Structures (246)
        • BOJ (104)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (27)
        • SQL (21)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    후위순회
    dfs
    DynamicProgramming
    binarySearch
    dp
    동적계획법
    Stack
    골드
    구현
    백트래킹
    백준
    유니온파인드
    전위순회
    algorithm
    스택
    경로압축
    이분탐색
    unionfind
    PriorityQueue
    다익스트라
    programmers
    BFS
    Union-Find
    알고리즘
    투포인터
    baekjoon
    프로그래머스
    Dijkstra
    Java
    SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
1504. 특정한 최단경로 (Java)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.