티스토리 뷰
1) 생각
양방향 그래프에서 DFS(깊이 우선 탐색)과 BFS(넓이 우선 탐색)을 진행하여라.
처음 생각
DFS를 Stack으로 구현을 해보았고 재귀를 통해서도 구현을 하였다.
다음 생각
BFS를 Queue를 사용하여 구현을 하였다.
다다음 생각
DFS를 수행한 후 방문 배열 초기화를 해주지 않아 BFS값이 제대로 출력이 안됐었다.
2) 방안
1) DFS를 수행한 다음 BFS를 수행하기전 방문배열 초기화를 해주었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int n,m,v; static List<ArrayList<Integer>> list; static StringBuilder sb; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); list = new ArrayList<>(); sb = new StringBuilder(); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); v = Integer.parseInt(st.nextToken()); // list 초기화 점의 번호가 1부터 시작해서 0~n까지 생성 for(int i=0;i<=n;i++) list.add(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()); list.get(a).add(b); list.get(b).add(a); } // 방문 할 수 있는 점이 여러개일경우 작은 번호부터 방문하라고 되어 있으므로 // 각 점과 연결되어있는 점의 번호를 정렬해주자. for(int i=1;i<=n;i++) Collections.sort(list.get(i)); visited = new boolean[n+1]; dfs(v,0); sb.substring(0,sb.length()-1); sb.append("\n"); Arrays.fill(visited, false); bfs(); System.out.println(sb); } static boolean[] visited; private static void dfs(int vertex,int cnt) { sb.append(vertex+" "); visited[vertex] = true; for(int i=0;i<list.get(vertex).size();i++) { int t = list.get(vertex).get(i); if(visited[t]) continue; dfs(t,cnt+1); } } private static void bfs() { Queue<Integer> queue = new LinkedList<>(); queue.add(v); visited[v] = true; while(!queue.isEmpty()) { int t = queue.poll(); sb.append(t+" "); for(int i=0;i<list.get(t).size();i++) { int tt = list.get(t).get(i); if(visited[tt]) continue; visited[tt] = true; queue.add(tt); } } } } | cs |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2789번 유학 금지 (0) | 2018.09.02 |
---|---|
[백준] 2455번 지능형 기차 (0) | 2018.08.31 |
[백준] 12813번 이진수 연산(Java) (0) | 2018.08.29 |
[백준] 1018번 체스판 다시 칠하기 (0) | 2018.08.28 |
[백준] 13458번 시험 감독(Java) (0) | 2018.08.27 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday