03
25

 

 

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

 

1753๋ฒˆ: ์ตœ๋‹จ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1 ≤ K ≤ V)๊ฐ€

www.acmicpc.net

 

 


์˜ค๋‹ต๋…ธํŠธ(ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ )

๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€๋ฉด ๋œ๋‹ค.

 

๋‚ด๊ฐ€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ตํžˆ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ๋Š” ํŽธ์ด๋ผ ํ•œ์ค„ ํ•œ์ค„ ๋ถ„ํ•ดํ•ด์„œ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค.

static class Node {
		int end, w;

		Node(int end, int w) {
			this.end = end;
			this.w = w;
	}
}

๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์‹œ์ž‘์ •์ ์—์„œ ๋ชฉํ‘œ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋‹ค. ๊ฐ ์ •์ ๋ณ„ Node๋ฅผ ๊ฐ–๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ถœ๋ฐœ ์ง€์ ์€ ํ•„์š”์—†๋‹ค. end๊นŒ์ง€ ๊ฐ€๋Š” ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ w๋‹ค.

static int v, e;
static List<Node>[] list;
static int[] dist;
static PriorityQueue<Node> pq;

์ •์  ์ •๋ณด๋ฅผ ๋ฐ›์„(start๋กœ ์‚ฌ์šฉํ• ) v - e(end๋กœ ์‚ฌ์šฉํ• )๊ฐ€ ์žˆ๊ณ , Node๋ฅผ ์›์†Œ๋กœํ•˜๋Š” list๋ฅผ ๋งŒ๋“ ๋‹ค.

๊ฐ ์ถœ๋ฐœ์ง€์  ์—์„œ ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•  dist, ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ์ •์ ์„ ์‰ฝ๊ฒŒ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์„ ์–ธํ•ด์ค€๋‹ค.

int INF = 100000000;
list = new ArrayList[v + 1];
dist = new int[v + 1];

Arrays.fill(dist, INF);
for (int i = 1; i <= v; i++) {
	list[i] = new ArrayList<>(); // ๊ฐ ๋…ธ๋“œ(์ •์ )์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
}

pq = new PriorityQueue<Node>((o1, o2) -> {
	return o1.w - o2.w;
});

์ดˆ๊ธฐํ™” ์ž‘์—…์ด๋‹ค. INF๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์ด๋ก ์—์„œ ๋ณผ์ˆ˜์žˆ๋Š” ๋ฌดํ•œ๋Œ€ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ธธ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์ด๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ index๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ v+1๋กœ ์‚ฌ์ด์ฆˆ๋ฅผ ์žก์•„์ค€๋‹ค. ์ฐธ๊ณ ๋กœ list์˜ ์›์†Œ ๊ฐ๊ฐ์€ Node๋ฅผ ์›์†Œ๋กœ ํ•˜๋Š” list๊ฐ€ ๋œ๋‹ค. ์ธ์ ‘๋ฆฌ์ŠคํŠธ ๊ฐœ๋…๊ณผ ๋™์ผํ•˜๋‹ค.

๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ์—๋„ ArrayList๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฑธ ํ•˜์ง€์•Š์œผ๋ฉด null๋กœ ๋‚จ์•„์žˆ๋‹ค.

// ๊ฐ„์„  ๊ฐœ์ˆ˜
for (int i = 0; i < e; i++) {
	st = new StringTokenizer(br.readLine(), " ");
	int from = Integer.parseInt(st.nextToken());
	int to = Integer.parseInt(st.nextToken());
	int w = Integer.parseInt(st.nextToken());
	// from์—์„œ to๋กœ ๊ฐ€๋Š” weight ๊ฐ€์ค‘์น˜
	list[from].add(new Node(to, w));
}

 ์‹œ์ž‘ ์ •์ ์˜ ๋ฆฌ์ŠคํŠธ์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ค‘์น˜์™€ ํ•จ๊ป˜ ๋‹ด๋Š”๋‹ค. ์ด๊ฒŒ ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค. 

์ด์ œ ๋‹ค์ต์ŠคํŠธ๋ผ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ๋‹ค. 

private static void dijkstra(int start) {
		boolean[] check = new boolean[v + 1]; // ํ™•์ •๋œ ๋…ธ๋“œ๋ฅผ ํ‘œ์‹œํ•จ
		pq.add(new Node(start, 0));
		dist[start] = 0;

		while (!pq.isEmpty()) {
			Node curNode = pq.poll();
			int cur = curNode.end;

			if (check[cur] == true)
				continue;
			check[cur] = true;

			for (Node node : list[cur]) {
				if (dist[node.end] > dist[cur] + node.w) {
					dist[node.end] = dist[cur] + node.w;
					pq.add(new Node(node.end, dist[node.end]));
				}
			}
		}
	}

 

check ๋ฐฐ์—ด๋„ dist์™€ ๋™์ผํ•œ ํฌ๊ธฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์‹œ์ž‘ ์ •์ ์„ pq์— ๋„ฃ์œผ๋ฉด์„œ ์‹œ์ž‘ํ•œ๋‹ค. 

์‹œ์ž‘ ์ •์ ์—์„œ ์‹œ์ž‘์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜๋Š” 0์ด๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์ •์ ์ด ๊ฒฝ์œ ์ง€๋ผ๋Š” ์ƒ๊ฐ์„ ํ•ด์•ผ ์ดํ•ด๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ์— ๊ฐ€์ค‘์น˜๋ฅผ ์—†์• ๋ฉด ์ผ๋ฐ˜ BFS๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ ์ž์ฒด๋Š” ๋น„์Šทํ•˜๋‹ค. 

 

ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋„์ฐฉํ•  ์ •์ ์„ end๋กœ ๊ฐ–๊ณ ์˜จ๋‹ค. ๋งŒ์•ฝ ๋ฐฉ๋ฌธํ•œ ์ •์ ์ด๋ผ๋ฉด loop๋ฅผ continueํ•˜๊ณ  ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋ฝ‘๋Š”๋‹ค.

๋ฐฉ๋ฌธ์ง€์•Š์•˜์œผ๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ , ๋„์ฐฉํ•  ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ๋‹ค ๋Œ๋ฉด์„œ, ํ˜„์žฌ ์ •์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ„ ๊ฑฐ๋ฆฌ(๊ฐ€์ค‘์น˜)๊ฐ€ ๋” ๊ฐ€๊น๋‹ค๋ฉด ๊ฐฑ์‹ ํ•ด์ฃผ๊ณ  pq์— ํ˜„์žฌ ๋„์ฐฉํ•œ ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ์ •์ , ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.


์ •๋‹ต์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {
	static class Node {
		int end, w;

		Node(int end, int w) {
			this.end = end;
			this.w = w;
		}
	}

	static int v, e;
	static List<Node>[] list;
	static int[] dist;
	static PriorityQueue<Node> pq;

	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/boj.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		v = Integer.parseInt(st.nextToken());
		e = Integer.parseInt(st.nextToken());
		int s = Integer.parseInt(br.readLine());
		int INF = 100000000;
		list = new ArrayList[v + 1];
		dist = new int[v + 1];

		Arrays.fill(dist, INF);
		for (int i = 1; i <= v; i++) {
			list[i] = new ArrayList<>(); // ๊ฐ ๋…ธ๋“œ(์ •์ )์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
		}

		pq = new PriorityQueue<Node>((o1, o2) -> {
			return o1.w - o2.w;
		});

		// ๊ฐ„์„  ๊ฐœ์ˆ˜
		for (int i = 0; i < e; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			// from์—์„œ to๋กœ ๊ฐ€๋Š” weight ๊ฐ€์ค‘์น˜
			list[from].add(new Node(to, w));
		}
		dijkstra(s);
		StringBuilder sb = new StringBuilder();
		for(int i = 1; i <= v; i++){
            if(dist[i] == INF) sb.append("INF\n");
            else sb.append(dist[i]).append("\n");
        }
		System.out.println(sb);
		
	}


	private static void dijkstra(int start) {
		boolean[] check = new boolean[v + 1]; // ํ™•์ •๋œ ๋…ธ๋“œ๋ฅผ ํ‘œ์‹œํ•จ
		pq.add(new Node(start, 0));
		dist[start] = 0;

		while (!pq.isEmpty()) {
			Node curNode = pq.poll();
			int cur = curNode.end;

			if (check[cur] == true)
				continue;
			check[cur] = true;

			for (Node node : list[cur]) {
				if (dist[node.end] > dist[cur] + node.w) {
					dist[node.end] = dist[cur] + node.w;
					pq.add(new Node(node.end, dist[node.end]));
				}
			}
		}
	}
}

 

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT