๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 11403๋ฒˆ: ๊ฒฝ๋กœ ์ฐพ๊ธฐ(dfs, bfs)

by ์ฃผ๋ฐœ2 2020. 2. 5.
๋ฐ˜์‘ํ˜•

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

 

11403๋ฒˆ: ๊ฒฝ๋กœ ์ฐพ๊ธฐ

๊ฐ€์ค‘์น˜ ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ G๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ์ •์  (i, j)์— ๋Œ€ํ•ด์„œ, i์—์„œ j๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

www.acmicpc.net

dfs ์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	static int[][] graph;	// ๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„ ์ธ์ ‘ ํ–‰๋ ฌ
	static int[][] path;	// ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•  2์ฐจ์› ๋ฐฐ์—ด
	static boolean[] visit;	// ํƒ์ƒ‰ ์—ฌ๋ถ€ ์ฒดํฌ
	static int N;			// ์ •์ ์˜ ๊ฐฏ์ˆ˜

	public static void dfs(int x, int y) {
		visit[y] = true;	// ๊ฐ ํ–‰๋งˆ๋‹ค ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ฒดํฌํ•˜๋ฏ€๋กœ y๊ฐ’ ์ฒดํฌ
		path[x][y] = 1;		// x -> y๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ ์กด์žฌ, 1๋กœ ์„ค์ •

		for(int i=0; i<N; i++) {
			if(graph[y][i] == 1 && visit[i] == false) {
				dfs(x, i);
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();
		graph = new int[N][N];
		path = new int[N][N];
		visit = new boolean[N];

		// ๊ทธ๋ž˜ํ”„์˜ ์ธ์ ‘ ํ–‰๋ ฌ
		// i => j ๊ฐ„์„ ์ด ์กด์žฌํ•˜๋ฉด 1, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด 0
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				graph[i][j] = scan.nextInt();
			}
		}

		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				visit[j] = false;	// ํ–‰(i) ๋งˆ๋‹ค ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐฉ๋ฌธํ•œ๊ณณ ์ดˆ๊ธฐํ™”
			}

			for(int j=0; j<N; j++) {
				if(graph[i][j] == 1 && visit[j] == false) {
					dfs(i, j);
				}
			}
		}

		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				System.out.print(path[i][j] + " ");
			}
			System.out.println();
		}
	}
}

 

bfs ์ฝ”๋“œ

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int[][] graph;	// ๊ทธ๋ž˜ํ”„ ์ธ์ ‘ ํ–‰๋ ฌ
	static int[][] result;	// ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•  ๋ฐฐ์—ด
	static boolean[] visit;	// ํƒ์ƒ‰ ์—ฌ๋ถ€ ์ฒดํฌ
	static int N;			// ์ •์ ์˜ ๊ฐฏ์ˆ˜

	public static void bfs(int start) {
		Queue<Integer> q = new LinkedList<Integer>();
		q.offer(start);	
		
		while(!q.isEmpty()) {
			int temp = q.poll();	// ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜ ๋นผ์ค€๋‹ค.
			for(int i=0; i<N; i++) {
				if(graph[temp][i] == 1 && visit[i] == false) { 
					q.offer(i);
					visit[i] = true;	// ๋ฐฉ๋ฌธํ•œ๊ณณ - ๋‹ค์‹œ ๋ฐฉ๋ฌธX, true๋กœ ์ฒดํฌ
					/*
					 * ์˜ˆ์ œ ์ž…๋ ฅ์„ ๋ณด๋ฉด,
					 *      0 1 0
					 *      0 0 1
					 *      1 0 0
					 * 0์€ 1๋กœ ์—ฐ๊ฒฐ, 1์€ 2๋กœ ์—ฐ๊ฒฐ, 2๋Š” 0์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ
					 * ์ตœ์ข…์ ์œผ๋กœ 0์€ 1, 2, ๋‹ค์‹œ 0์œผ๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์Œ
					 */
					result[start][i] = 1;	// ๊ฒฝ๋กœ์กด์žฌํ•  ์‹œ 1๋กœ ๋ณ€๊ฒฝ.	
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();
		graph = new int[N][N];
		result = new int[N][N];
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				graph[i][j] = scan.nextInt();
			}
		}
		
		for(int i=0; i<N; i++) {
			visit = new boolean[N];
			bfs(i);
		}
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				System.out.print(result[i][j] + " ");
			}
			System.out.println();
		}
		scan.close();
	}

}

ํ’€์ด

๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ• ๋•Œ๋งˆ๋‹ค, ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ• ๋•Œ 1๋กœ ์„ค์ •ํ•œ๋‹ค.

๊ธฐ์กด์˜ dfs์™€ ๋™์ผํ•˜๊ฒŒ i -> j๋กœ ๊ฐˆ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€๊ฒฝ์šฐ dfs๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

dfs์—์„œ๋Š” ํ˜ธ์ถœ๋ฐ›์€ i, j ์ขŒํ‘œ๋Š” ๋ฐฉ๋ฌธํ• ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฏ€๋กœ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•˜๊ณ , ์ถœ๋ ฅํ•  ๋ฐฐ์—ด path[][]์— 1๋กœ ์„ค์ •ํ•œ๋‹ค.

 

์‚ฌ์‹ค ์•„์ง dfs, bfs, ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์™„๋ฒฝ์น˜ ์•Š์•„์„œ ๊ตฌํ˜„๋„ ์–ด๋ ค์› ๊ณ ... ๋ธ”๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ญ๊ฐœ๋Š” ๋ณธ๊ฒƒ๊ฐ™๋‹ค ใ… ใ… 

ํ•˜๋‚˜ํ•˜๋‚˜ ๋…ผ๋ฆฌ๋ฅผ ๊ทธ๋ ค๊ฐ€๋ฉฐ ์ดํ•ดํ•ด๋ณด๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค ...

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€