풀이
인접행렬 또는 인접리스트를 활용해 풀 수 있는 문제인데
인접행렬 사용시 시간 복잡도 : O(V^2)
인접리스트 사용시 시간 복잡도 : O(V+E)
이므로 인접리스트를 사용하여 푸는 것이 좋다.
양방향 간선이기 때문에 ArrayList<ArrayList>를 사용해서 하나의 간선을 입력받을 시 반대 간선도 같이 저장 시켜주는 방식으로 구현.
ex) (1,2) 가 들어올 시 (2,1)도 함께 저장
DFS/BFS는 기초 방식대로 사용.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class DFS_BFS {
static ArrayList<ArrayList<Integer>> map = new ArrayList<>();
static boolean[] visited;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
for(int i = 0; i <= N; i++){
map.add(new ArrayList<>());
}
visited = new boolean[N+1];
for(int i = 1; i <= M; i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map.get(x).add(y);
map.get(y).add(x);
}
dfs(V);
visited = new boolean[N+1];
System.out.println();
bfs(V);
}
public static void dfs(int v){
visited[v] = true;
System.out.print(v + " ");
for(int value : map.get(v)){
if(!visited[value]){
dfs(value);
}
}
}
public static void bfs(int v){
Queue<Integer> q = new LinkedList<>();
q.offer(v);
visited[v] = true;
while(!q.isEmpty()){
int value = q.poll();
System.out.print(value + " ");
for(int e : map.get(value)){
if(!visited[e]){
visited[e] = true;
q.offer(e);
}
}
}
}
public static void printEdge(){
for(int i = 0; i<map.size(); i++){
for(int j = 0; j<map.get(i).size(); j++){
System.out.print(map.get(i).get(j) + " ");
}
System.out.println();
}
}
}