문제 : 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)
소스코드
package BOJ;
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 BOJ_1260_DFS와BFS_Main {
private static int[][] matrix;
private static int N;
private static int M;
private static boolean[] visitedD;
private static boolean[] visitedB;
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());
int V = Integer.parseInt(st.nextToken()); // 탐색을 시작할 정점 번호
matrix = new int[N+1][N+1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine()," ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
matrix[a][b] = 1;
matrix[b][a] = 1;
}
visitedD = new boolean[N+1];
visitedD[V] = true;
System.out.print(V+" ");
dfs(V);
System.out.println();
visitedB = new boolean[N+1];
bfs(V);
}
private static void bfs(int v) {
Queue<Integer> q = new LinkedList<Integer>();
q.offer(v);
visitedB[v]=true;
while(!q.isEmpty()) {
int cur = q.poll();
System.out.print(cur+" ");
for (int i = 1; i <= N; i++) {
if(matrix[cur][i]==1&&!visitedB[i]) {
visitedB[i]=true;
q.offer(i);
}
}
}
}
private static void dfs(int v) {
for (int i = 1; i <= N; i++) {
if(!visitedD[i]&&matrix[v][i]==1) {
visitedD[i]=true;
System.out.print(i+" ");
dfs(i);
}
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA]백준_2589_보물섬 (0) | 2021.01.28 |
---|---|
[JAVA]백준_5427_불 (0) | 2021.01.25 |
[JAVA]백준_13335_트럭 (0) | 2021.01.20 |
[JAVA]백준_10819_차이를최대로 (0) | 2021.01.19 |
[JAVA]백준_10974_모든 순열 (0) | 2021.01.19 |