Koala - 11기/코딩테스트 준비 스터디
[백준/Java] 1260 DFS와 BFS
알 수 없는 사용자
2023. 8. 20. 17:13
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의 기본 구현문제입니다.
기본적으로는 dfs는 스택, bfs는 큐를 통해 구현하였습니다.
그리고 탐색 문제는 방문 여부를 판단하는 boolean 배열이 필요하므로, isVisit배열을 만들어 문제를 해결합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
public class Main {
static int N;
static int M;
static int k;
static ArrayList<Integer> arr[];
static boolean[] isVisit;
static StringBuilder sb;
public static void main(String[] args) throws NumberFormatException, 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());
k=Integer.parseInt(st.nextToken());
arr= new ArrayList[N+1]; //좌표를 그대로 받아들이기 위해 +1 사용
isVisit=new boolean[N+1];
sb= new StringBuilder();
for(int i=0;i<arr.length;i++){
arr[i]=new ArrayList<>();
}
for(int i=0;i<M;i++){
st=new StringTokenizer(br.readLine());
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());
arr[a].add(b);
arr[b].add(a);
}
for(int i=0;i<arr.length;i++){
Collections.sort(arr[i]);
}
dfs(k);
isVisit=new boolean[N+1];
sb.append("\n");
bfs(k);
System.out.println(sb);
}
public static void dfs(int index){
isVisit[index]=true;
sb.append(index+" ");
for(int i:arr[index]){
if(!isVisit[i])
dfs(i);
}
}
public static void bfs(int index){
isVisit[index]=true;
Queue<Integer> q= new LinkedList<>();
q.add(index);
while (!q.isEmpty()){
int a= q.poll();
sb.append(a+" ");
for(int i: arr[a]){
if(!isVisit[i])
{
q.add(i);
isVisit[i]=true;
}
}
}
}
}