반응형

[광고 누르면 오늘의 행운 상승!!]

  • 비선형구조인 그래프 구조는 그래프로 표현된 모든 자료를
    빠짐없이 검색하는 것이 중요함.

  • 두가지 방법
    - 깊이 우선 탐색(Depth First Search)
    - 너비 우선 탐색(Breadth First Search)

  • 시작 정점의 한 방향으로 갈 수 있는 경로가 있는 곳까지 깊이 탐색해 가다가
    더 이상 갈 곳이 없게 되면, 가장 마지막에 만났던 갈림길 간선이 있는
    정점으로 되돌아와서 다른 방향의 정점으로 탐색을 계속 반복하여 결국 모든
    정점을 방문하는 순회방법

  • 가장 마지막에 만났던 갈림길의 정점으로 되돌아가서 다시 깊이 우선 탐색을
    반복해야 하므로 후입선출 구조의 스택 사용

DFS(재귀를 이용한 방법)

package DFS;

import java.io.*;
import java.util.*;
public class DfsTest {

	public static int V,E;
	public static int[][] graph;
	public static boolean[] visit;
	public static Stack<Integer> stack;
	
	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("res/input_dfs.txt"));
		Scanner sc=  new Scanner(System.in);

		V = sc.nextInt();
		E = sc.nextInt();
		
		graph = new int[V][V];
		
		for(int i =0; i < E ; i++) {
			int v = sc.nextInt();
			int u = sc.nextInt();
			graph[v][u] = graph[u][v] =  1;
			
		}
		//for(int[] a: graph) System.out.println(Arrays.toString(a));
		
		visit = new boolean[V];
		dfs(0);
		sc.close();
	}
	public static void dfs(int node) {
		visit[node] = true;
		System.out.print(node + " ");
		
		for (int next = 0; next < V; next++) {
			if(!visit[next] && graph[node][next] == 1) { //방문하지 않았고 인접하여 있다면.
				dfs(next);
			}
		}
	}

}

DFS(스택을 이용한 방법)

package DFS;

import java.io.FileInputStream;
import java.util.Scanner;
import java.util.Stack;

public class DfsTest2 {

	public static int V,E;
	public static int[][] graph;
	public static boolean[] visit;
	public static Stack<Integer> stack;
	
	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("res/input_dfs.txt"));
		Scanner sc=  new Scanner(System.in);

		V = sc.nextInt();
		E = sc.nextInt();
		
		graph = new int[V][V];
		stack = new Stack<Integer>();
		
		for(int i =0; i < E ; i++) {
			int v = sc.nextInt();
			int u = sc.nextInt();
			graph[v][u] = graph[u][v] =  1;
			
		}
		//for(int[] a: graph) System.out.println(Arrays.toString(a));
		
		visit = new boolean[V];
		dfs2(0);
		sc.close();
	}
	public static void dfs2(int node) {
		visit = new boolean[V];
		stack.push(node);
		while(!stack.empty()) {	
			int curr = stack.pop();
			if(!visit[curr]) { //방문하지 않았다.
				visit[curr] = true;
				System.out.print(curr + " ");
				for(int next = V-1; next>=0; next--) { // 0 1 3 5 4 2 6 //왼쪽부터
				//for (int next = 0; next < V; next++) { // 0 2 4 5 6 3 1 //오른쪽부터
					if(!visit[next] && graph[curr][next] == 1) {
						stack.push(next);
					}
				}
			}
		}
	}
	
	
}

 

반응형

'1. 알고리즘 이론 > 2. DFS, BFS' 카테고리의 다른 글

BFS(너비우선탐색)  (0) 2020.03.01

+ Recent posts