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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제해설

가장 기본적인 DFS와 BFS 문제입니다.

다만, 문제 조건의 

단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다

해당 조건을 간과하여 코딩하여 오류를 찾는데 시간이 좀 걸렸습니다.

코드

인접리스트로 구현하여 노드의 정보를 저장했습니다.

import java.util.*;
public class Main {
public static int N, M, V;
public static ArrayList<Node>[] nodes;
public static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
V = sc.nextInt();
nodes = new ArrayList[N+1];
for(int i=1;i<=N;i++) {
nodes[i] = new ArrayList<Node>();
}
for(int i=0;i<M;i++) {
int nodeA = sc.nextInt();
int nodeB = sc.nextInt();
nodes[nodeA].add(new Node(nodeB));
nodes[nodeB].add(new Node(nodeA));
}
visited = new boolean[N+1];
DFS(V);
System.out.println();
visited = new boolean[N+1];
BFS(V);
}
public static void DFS(int start) {
visited[start] = true;
System.out.print(start + " ");
Collections.sort(nodes[start]);
for(int i=0;i<nodes[start].size();i++) {
int endNode = nodes[start].get(i).endNode;
if(visited[endNode] == false) {
DFS(endNode);
}
}
}
public static void BFS(int start) {
Queue<Integer> q = new LinkedList<>();
visited = new boolean[N+1];
q.offer(start);
visited[start] = true;
while(!q.isEmpty()) {
int startNode = q.poll();
System.out.print(startNode+" ");
Collections.sort(nodes[startNode]);
for(int i=0;i<nodes[startNode].size();i++) {
int endNode = nodes[startNode].get(i).endNode;
if( visited[endNode] == false) {
q.offer(endNode);
visited[endNode] = true;
}
}
}
System.out.println();
}
}
class Node implements Comparable<Node>{
int endNode;
public Node(int endNode) {
this.endNode = endNode;
}
@Override
public int compareTo(Node other) {
if(this.endNode > other.endNode) {
return 1;
}else if(this.endNode < other.endNode) {
return -1;
}else {
return 0;
}
}
}

 

더 간단하게 노드 간의 그래프를 행렬로 표현하여 나타낼 수 있습니다.

package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
private static int N, K, M;
private static int answer = 0;
private static int[] arr;
private static int[][] matric;
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());
matric = new int[N][N];
int V = Integer.parseInt(st.nextToken());
for(int i=0;i<M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken()) - 1;
int b = Integer.parseInt(st.nextToken()) - 1;
matric[a][b] = 1;
matric[b][a] = 1;
}
//DFS 실행
boolean[] visited = new boolean[N];
visited[V-1] = true;
DFS(0, V - 1, visited);
//BFS 실행
System.out.println();
BFS(V-1);
}
public static void DFS(int depth, int now, boolean[] visited) {
System.out.print(now + 1+" ");
for(int c=0; c<N; c++) {
if(visited[c] == true) continue;
if(matric[now][c] == 1) {
visited[c] = true;
DFS(depth + 1, c, visited);
}
}
}
public static void BFS(int now) {
Queue<Integer> q = new LinkedList<>();
boolean[] visited = new boolean[N];
q.offer(now);
visited[now] = true;
while(!q.isEmpty()) {
int temp = q.poll();
System.out.print(temp+1 +" ");
for(int c = 0; c < N; c++) {
if(matric[temp][c] == 1 && visited[c] == false) {
visited[c] = true;
q.offer(c);
}
}
}
}
}

+ Recent posts