인접행렬 방식으로 풀었다.
import java.io.*;
import java.util.*;
public class Main {
// 인접행렬 생성
static int[][] graph;
// 방문했는지 확인하기 위한 행렬
static boolean[] visit;
// 정점의 개수
static int N;
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());
// 간선의 개수
int M = Integer.parseInt(st.nextToken());
// 시작 정점
int V = Integer.parseInt(st.nextToken());
// [정점의 개수+1][정점의 개수+1]
graph = new int[N+1][N+1];
visit = new boolean[N+1];
// 인접행렬에 간선 체크
for(int i=0;i<M;i++) {
st = new StringTokenizer(br.readLine()," ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x][y] = 1;
graph[y][x] = 1;
}
dfs(V);
System.out.println();
// dfs 수행 뒤 방문한 정점을 다시 초기화
for(int i=0;i<visit.length;i++)visit[i] = false;
bfs(V);
}
public static void dfs(int v) {
// 정점을 방문했다고 체크
visit[v] = true;
// 방문한 정점 출력
System.out.print(v+" ");
for(int i=1;i<N+1;i++) {
// 인접 정점 중 아직 미방문인 정점에 대해 dfs 재귀호출
if(graph[v][i]==1&&visit[i]==false) {
dfs(i);
}
}
}
public static void bfs(int v) {
// 큐 생성
Queue<Integer> q = new LinkedList<>();
// 정점을 큐에 추가
q.offer(v);
// 정점을 방문했다고 체크
visit[v] = true;
// 큐가 빌 때까지 반복
while(!q.isEmpty()) {
// 큐에서 수 하나를 제거
int tmp = q.poll();
// 출력
System.out.print(tmp+" ");
// 큐에서 제거한 정점의 인접 정점을 큐에 넣고 방문했다고 체크
for(int i=1;i<N+1;i++) {
if(graph[tmp][i]==1&&visit[i]==false) {
q.offer(i);
visit[i] = true;
}
}
}
}
}
'[BOJ] - JAVA' 카테고리의 다른 글
[백준] 10451 : 순열 사이클 JAVA 풀이 (0) | 2022.10.12 |
---|---|
[백준] 11724 : 연결 요소의 개수 JAVA 풀이 (0) | 2022.10.12 |
[백준] 1158 : 요세푸스 문제 JAVA 풀이 (0) | 2022.10.10 |
[백준] 10866 : 덱 JAVA 풀이 (0) | 2022.10.10 |
[백준] 6588 : 골드바흐의 추측 JAVA 풀이 (0) | 2022.10.10 |