03
31

โ–ถ ์œ ํ˜•

  • ํ•œ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋„์ฐฉ ์ •์  ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ
  • ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” BFS
  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด O(V^2), ์‚ฌ์šฉํ•˜๋ฉด O(E+VlogV)๊ฐ€ ๋œ๋‹ค(V๋Š” ์ •์ ๊ฐœ์ˆ˜,  E๋Š” ๊ฐ„์„  ๊ฐœ์ˆ˜)

์ƒˆ ์ •์ ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ, ๊ทธ ์ •์ ์— ์ธ์ ‘ํ•ด์žˆ๋Š” ์ •์ ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ •์ ์ด๋ผ๋ฉด ์ €์žฅ๋ผ์žˆ๋Š” ๊ฒฝ๋กœ ๊ฐ€์ค‘์น˜์™€ ์ƒˆ ์ •์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ๋น„๊ตํ•ด ๋” ๊ฐ€๊นŒ์šด ๊ฒฝ๋กœ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. ๊ฒฝ์œ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด ํ•„์š”ํ•œ๋ฐ, ์ถœ๋ฐœ ์ •์ ๋„ ์ž๊ธฐ ์ž์‹ ์„ ๊ฒฝ์œ ํ•ด์„œ ์ตœ์†Œ ๊ฐ’์„ ๋‹ด๋Š”๋‹ค๋Š” ๊ฐœ๋…์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ณด์ž

์ด๋•Œ source๋Š” ์ถœ๋ฐœ์ •์ ์ด๋‹ค. while ๋ถ€๋ถ„์ด ๊ตฌํ˜„์ธ๋ฐ, ์ตœ์†Œ ํž™์œผ๋กœ ๋œ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ํ•˜๋‚˜ ๋ฝ‘๊ณ , ๊ทธ ์ •์ ์˜ ์ธ์ ‘ ์ •์ ๋“ค์„ ๋Œ๋ฉด์„œ ํ˜„์žฌ ์ •์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ€๋Š”๊ฒŒ ๋น ๋ฅธ์ง€(๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ ์€์ง€) ๊ฒฝ์œ ์•ˆํ•˜๋Š”๊ฒŒ ๋น ๋ฅธ์ง€ ๋น„๊ตํ•ด์„œ ์ถœ๋ฐœ ์ •์ ์—์„œ ๋„์ฐฉ ์ •์ ๊นŒ์ง€์˜ ๊ฐ ์ •์  ์‚ฌ์ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ•ฉ์ด ๋“ค์–ด์žˆ๋Š” dist๋ฐฐ์—ด์— ๊ธฐ๋กํ•œ๋‹ค.

โ–ถ ์ „๋žต

ํ‹€์„ ์™ธ์šฐ๋Š” ๊ฒŒ ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ถœ๋ฐœ ์ •์  - ๋„์ฐฉ ์ •์  ๋‘๊ฐœ๋งŒ ์ƒ๊ฐํ•˜๊ธฐ ๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ๋„์ฐฉ ์ •์ ๋งŒ ๋ณด๊ณ  ๋Œ๋ ค์•ผ ๋œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.

static class Node {
    int end, w;
    
    Node(int to, int w) {
        this.end = to;
        this.w = w;
    }
}
 
static PriorityQueue<Node> pq;
static List<Node>[] list;
static int[] dist;
static int v;
static int e;

๋„์ฐฉ ์ •์ ๊ณผ ๊ฑฐ๊ธฐ๊นŒ์ง€์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋“ค๊ณ ๋‹ค๋‹ Node ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

PriorityQueue๋ฅผ Min-Heap์œผ๋กœ(์˜ค๋ฆ„์ฐจ์ˆœ)๋กœ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ๊ฐ ์ •์ ์— ์ธ์ ‘ํ•œ ์ •์ ๋“ค์„ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์€ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์„œ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ •์ ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ์˜ ์ตœ์ ๊ฐ’์„ ๋‹ด์„ 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;
		});

dist๋ฐฐ์—ด์„ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์œผ๋กœ ๋จผ์ € ์ดˆ๊ธฐํ™” ํ•ด๋‘๊ณ , pq๋ฅผ min-heap์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์ด์ œ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๋ณด์ž.

	static void dijkstra(int start) { // ์‹œ์ž‘ ์ ์€ end๊ฐ€ 0์ด๋‹ค.
		boolean[] vis = 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 (vis[cur] == true)
				continue;
			vis[cur] = true;

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

์‹œ์ž‘ ์ •์ ์„ ๋„ฃ์„ ๋•Œ, ์ด๋•Œ์˜ ๊ฑฐ๋ฆฌ ๊ฐ’์€ ๋‹น์—ฐํžˆ 0์ด๊ณ  ์–ด๋”” ์ด๋™ํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ˆ๊นŒ dist[start]์—๋„ 0์ด ๋“ค์–ด๊ฐ„๋‹ค.

์ด ๊ณผ์ •์—์„œ vis ๋ฐฐ์—ด์ด ํ•˜๋‚˜ ๋” ํ•„์š”ํ•˜๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ •์ ์— ๋„์ฐฉํ•ด์„œ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ์ง€์•Š๋„๋ก ํ•˜๋Š” ๊ณผ์ •์ธ๋ฐ, ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ด๋ฏธ ๋„์ฐฉํ•œ ์ง€์ ์—์„œ์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ๋ง‰๊ธฐ์œ„ํ•ด ์„ค์ •ํ•˜๋Š” ์žฅ์น˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ๋„์ฐฉํ•œ ์ •์ ์˜ ์ธ์ ‘๋ฆฌ์ŠคํŠธ(๊ทธ ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ๋ชจ๋“  ์ •์ ๋“ค)์„ ์ˆœํšŒํ•œ๋‹ค.

๊ทธ ์ •์ ์œผ๋กœ ๋ฐ”๋กœ ๊ฐ€๋Š” ๊ฐ’๊ณผ, ํ˜„์žฌ ์ •์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ทธ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜๋ ค๊ณ  tmpW์— ๊ฐ’์„ ๋‹ด๋Š”๋‹ค. node.w๋Š” ๋„์ฐฉํ•œ ์ •์ ์— ์ธ์ ‘ํ•œ ์ •์ ์˜ ๊ฐ€์ค‘์น˜์ด๊ณ , ๋„์ฐฉํ•œ ์ •์ ๊นŒ์ง€์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•ด์„œ ๊ฒฝ์œ ํ•œ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•œ ๊ฒŒ tmpW๋‹ค.

 

์ด๊ฑธ dist[node.end]์™€ ๋น„๊ตํ•œ๋‹ค. dist[node.end]๋Š” ๋„์ฐฉํ•œ ์ •์ ๊ณผ ์ธ์ ‘ํ•œ ์ •์ ๊นŒ์ง€์˜ ํ˜„์žฌ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š”๋ฐ, ์ด๊ฑธ ๊ฐฑ์‹ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐฑ์‹ ํ•ด์„œ pq์— ๋‹ค์‹œ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ์—์„œ ์–ด๋ ค์›Œํ•˜๋Š” ๊ฑด, ์ž…๋ ฅ์ด ์ •์  - ์ •์  - ๊ฐ€์ค‘์น˜ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ, map์œผ๋กœ ์ค„ ๋•Œ๋‹ค. ๊ฐ„์„ ํ˜•ํƒœ๋ฅผ ๋‹ค ๋งŒ๋“ค์–ด์•ผํ•˜๋‚˜? ํ•˜๋Š” ๊ณ ๋ฏผ์—์„œ ๋ถ€ํ„ฐ ์ƒ๊ฐ์ด ๊ผฌ์ด๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์ž.

 

Node์˜ ํ˜•ํƒœ๋ถ€ํ„ฐ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค. ์ถœ๋ฐœ ์ •์ , ๋„์ฐฉ ์ •์ ์„ ๊ธฐ๋กํ•œ๋‹ค.

dist๋„ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ณ , ๋ชจ๋“  dist ์›์†Œ์— INF๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ์ด ์ •์  ๊ฐœ์ˆ˜, ๊ฐ„์„ ๊ฐœ์ˆ˜๋Š” map์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ nxn์ผ ๋•Œ ์•„๋ž˜ ์„ ์–ธํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

static class Node{
    int s;
    int e;
    int d;
     
    Node (int s, int e, int d) {
        this.s = s;
        this.e = e;
        this.d = d;
    }
}

static int dist[][];
v = n * n;// ์ •์  ๊ฐœ์ˆ˜๋Š” map ์นธ ๊ฐœ์ˆ˜
e = n * (n - 1) / 2; // ์ด ๊ฐ„์„  ๊ฐœ์ˆ˜

// main์—์„œ
for(int i=0;i<n;i++) {
                for(int j=0;j<n;j++) {
                    dist[i][j] = INF;
                }
            }

์ด์ œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” BFS๋ผ๊ณ  ์œ„์—์„œ ์ ์–ด๋†จ๋‹ค. map์„ ์ฃผ๊ณ  ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ผ๋Š” ๋ฌธ์ œ๋Š” BFS์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ฐฉํ–ฅ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ์œ ํšจ๋ฒ”์œ„ ์•ˆ์—์„œ ๋ฐฉํ–ฅ์„ ๋Œ๋ฉฐ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค.

static int[] di = { -1, 0, 1, 0 };
static int[] dj = { 0, 1, 0, -1 };

public static void dijkstra() {
        pq.add(new Node(0, 0, dist[0][0]));
        while(!pq.isEmpty()) {
            Node now = pq.poll();
            int ci = now.s;
            int cj = now.e;
            int d = now.d;
            if(d > dist[ci][cj])continue;
            for(int i=0;i<4;i++) {
                int ni = di[i] + ci;
                int nj = dj[i] + cj;
                if(ni>=0 && ni<n && nj>=0 && nj<n) {
                    if(dist[ni][nj] > dist[ci][cj] + map[ni][nj]) {
                        dist[ni][nj] = dist[ci][cj] + map[ni][nj];
                        pq.add(new Node(ni,nj,dist[ni][nj]));
                    }
            	}
        	}
    	}
	}
    

(0,0) -> (n-1.n-1) ๋กœ ๊ฐˆ ๋•Œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ๋‹ค. 

ํ‹€์€ ๊ฐ™์ง€๋งŒ, ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•˜๋˜๊ฒƒ์ด ๋ฐฉํ–ฅ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐ’ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์€ ์ด ์ฝ”๋“œ๊ฐ€ ๋” ๋ˆˆ์— ์ž˜๋“ค์–ด์˜ค๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค.

 

์ธ์ ‘๋ฆฌ์ŠคํŠธ, ์ธ์ ‘ํ–‰๋ ฌ ๋ชจ๋‘ ์ค‘์š”ํ•œ ๊ฑด ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. 

๋จผ์ € ์ธ์ ‘ํ–‰๋ ฌ

if(d > dist[ci][cj])continue;
            for(int i=0;i<4;i++) {
                int ni = di[i] + ci;
                int nj = dj[i] + cj;
                if(ni>=0 && ni<n && nj>=0 && nj<n) {
                    if(dist[ni][nj] > dist[ci][cj] + map[ni][nj]) {
                        dist[ni][nj] = dist[ci][cj] + map[ni][nj];
                        pq.add(new Node(ni,nj,dist[ni][nj]));
                    }
            	}
        	}

๊ทธ๋‹ค์Œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋‹ค.

boolean[] vis = new boolean[v + 1]; // ๋ฐฉ๋ฌธ์ฒดํฌํ•  ๋ฐฐ์—ด ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ์„ ์–ธ

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

			for (Node node : list[cur]) {
				int tmpW = dist[cur] + node.w; // dpํ‘ธ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ dist๊ฐ’๊ณผ ๋น„๊ตํ•ด์•ผ๋œ๋‹ค.
				if (dist[node.end] > tmpW) {
					dist[node.end] = tmpW;
					pq.add(new Node(node.end, dist[node.end]));
				}
			}

ํ‹€์„ ์ž˜ ์™ธ์›Œ์„œ ํ’€์ž.

 

 

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