PS/BOJ

1260

easy16 2022. 5. 6. 20:04

DFS와 BFS

 

기본 그래프 출력하기 : https://www.acmicpc.net/problem/1260

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int N, M, V;
	static int[][] graph;
	static boolean[] visited;
	static boolean DBG = false;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		visited = new boolean[N + 1];
		graph = new int[N + 1][N + 1];
		V = Integer.parseInt(st.nextToken());

		for (int i = 1; i <= M; i++) {
			st = new StringTokenizer(br.readLine());
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			graph[x][y] = graph[y][x] = 1;
		}
		StringBuilder sb = new StringBuilder();

		dfs(0, V, sb);
		sb.append('\n');
		bfs(V, sb);
		System.out.println(sb.toString());
	}

	private static void bfs(int v, StringBuilder sb) {
		visited = new boolean[N + 1];
		Queue<Integer> Q = new LinkedList<>();

		Q.offer(v);

		while (!Q.isEmpty()) {
			int size = Q.size();
			for (int q = 0; q < size; ++q) {
				int now = Q.poll();
				
				if(visited[now])
					continue;
				visited[now]=true;
				
				sb.append(now).append(' ');
				for ( int i = 1; i<=N ; i++) {
					if( graph[now][i] == 1 && !visited[i])
						Q.offer(i);
				}
				
			}
		}

	}

	private static void dfs(int level, int v, StringBuilder sb) {
		if (level == N) {
			return;
		}
		if (visited[v])
			return;
		sb.append(v).append(' ');
		visited[v] = true;
		for (int i = 1; i <= N; i++) {
			if (graph[v][i] == 1) {
				dfs(level + 1, i, sb);
			}
		}

	}

}