유블로그

BOJ 1916 최소비용 구하기 Java 본문

알고리즘

BOJ 1916 최소비용 구하기 Java

yujeong kang 2021. 6. 18. 10:06

BOJ 1916 최소비용 구하기 Java

 

https://www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

 

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

public class Main {
	static class Node implements Comparable<Node> {
		int e, w;
		public Node(int e, int w) {
			this.e = e;
			this.w = w;
		}
		@Override
		public int compareTo(Node o) {
			return w - o.w;
		}
	}
	
	static int N, M, S, E;
	static List<Node>[] list;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		list = new ArrayList[N+1];
		for (int i = 1; i <= N; i++) {
			list[i] = new ArrayList<>();
		}
		
		for (int i = 0; i < M; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int s = Integer.parseInt(st.nextToken());
			int e = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			list[s].add(new Node(e, c));
		}
		StringTokenizer st = new StringTokenizer(br.readLine());
		S = Integer.parseInt(st.nextToken());
		E = Integer.parseInt(st.nextToken());
		
		dijkstra();
		
	} // main

	static void dijkstra() {
		boolean[] visited = new boolean[N+1];
		int[] distance = new int[N+1];
		Arrays.fill(distance, Integer.MAX_VALUE);
		
		PriorityQueue<Node> pq = new PriorityQueue<>();
		distance[S] = 0;
		pq.offer(new Node(S, 0));
		
		Node cur;
		while(!pq.isEmpty()) {
			cur = pq.poll();
			if(visited[cur.e]) continue;
			
			visited[cur.e] = true;
		
			for(Node n : list[cur.e]) {
				if(!visited[n.e] && distance[n.e] > distance[cur.e] + n.w) {
					distance[n.e] = distance[cur.e] + n.w;
					pq.offer(new Node(n.e, distance[n.e]));
				}
			}
		} //while
		
		System.out.println(distance[E]);
	} // solve

}

 

다익스트라를 완전히 까먹어서 다시 상기시키는 시간..★

s -> e 로 가는 길에

가중치가 작은 간선들부터 방문하는데 그 간선에 이어진 노드들을 모두 보면서

노드를 방문하는 게 더 빠르면 pq 에 넣는다.

 

 

'알고리즘' 카테고리의 다른 글

BOJ 1806 부분합 자바 java  (0) 2021.06.19
BOJ 14502 연구소 Java  (0) 2021.06.18
BOJ 9251 LCS Java  (0) 2021.06.17
BOJ 2580 스도쿠 Java  (0) 2021.06.17
BOJ 13549 숨바꼭질 3 java  (0) 2021.06.14