본문 바로가기

ProgramSoliving

백준 : 2252 DFS ,BFS

반응형

줄세이구 풀이방버은 DFS 접근과 BFS 접근이 있다.

 

1. DFS 풀이방법

 

보기에서 주어지는 순서는 그래프를 나타낸다 필드상에 여러그래프들을 DFS 탐색하고 종료되는 순서 stack에 저장한다.

Stack 에 pop하는 순서대로 위상정렬된 순서이다.

 

2. BFS 풀이방법.

 

u->v 로간다면 v의 카운터를 1증가시킨다. 이렇게보면 현재 줄을 세울수 있는 사람은 cnt = 0인 사람이다.

 

이원리로 BFS탐색을한다면 위상정렬이 이루어 진다.

 

DFS 코드

package 백준;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Stack;

public class 줄세우기DFS {
	static int N, M;
	static ArrayList<Integer> ver[];
	static Stack<Integer> stack = new Stack<Integer>();
	static boolean visit[];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str;

		str = br.readLine().split(" ");

		N = Integer.parseInt(str[0]);
		M = Integer.parseInt(str[1]);
		visit = new boolean[N + 1];
		ver = new ArrayList[N + 1];

		for (int n = 1; n <= N; n++) {
			ver[n] = new ArrayList<Integer>();
		}

		for (int i = 0; i < M; i++) {
			str = br.readLine().split(" ");
			int u = Integer.parseInt(str[0]);
			int v = Integer.parseInt(str[1]);

			ver[u].add(v);
		}

		for (int n = 1; n <= N; n++) {
			if(visit[n])
				continue;
			dfs(n);
		}
		
		StringBuilder sb = new StringBuilder();
		while(!stack.isEmpty()) {
			sb.append(stack.pop()).append(' ');
		}
		System.out.println(sb.toString());
	}

	public static void dfs(int n) {
		
		visit[n] = true;
		for(int next : ver[n]) {
			if(visit[next])
				continue;
			dfs(next);
		}
		stack.add(n);
		
	}
}

BFS 코드

package 백준;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class 줄세우기BFS {
	static int N, M;
	static int Cnt[];
	static ArrayList<Integer>[] list;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str;

		str = br.readLine().split(" ");

		N = Integer.parseInt(str[0]);
		M = Integer.parseInt(str[1]);
		list = new ArrayList[N + 1];
		Cnt = new int[N + 1];

		for (int n = 1; n <= N; n++) {
			list[n] = new ArrayList<Integer>();
		}
		
		for (int i = 0; i < M; i++) {
			str = br.readLine().split(" ");
			int u = Integer.parseInt(str[0]);
			int v = Integer.parseInt(str[1]);
			list[u].add(v);
			Cnt[v]++;
		}
		
//		PriorityQueue<Pair> q = new PriorityQueue<>();
		Queue<Integer> q = new LinkedList<Integer>();
		for (int n = 1; n <= N; n++) {
			if (Cnt[n] == 0) {
				q.add(n);
			}
		}
		StringBuilder ans = new StringBuilder();
		while (!q.isEmpty()) {
			int cur = q.poll();
			ans.append(cur).append(' ');

			for (int next : list[cur]) {
				if (Cnt[next] == 0)
					continue;
				Cnt[next]--;
				if (Cnt[next] == 0) {
					q.add(next);
				}
			}
		}
		System.out.println(ans.toString());
	}

	static StringBuilder sb = new StringBuilder();
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1360 되돌리기  (0) 2020.05.16
백준 : 1022  (0) 2020.05.14
백준 : 2262  (0) 2020.05.06
백준 : 4354 java  (0) 2020.05.05
백준 : 17387  (0) 2020.05.05