티스토리 뷰

728x90
반응형

목차

     

    문제

     

    그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 

    단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 

    더 이상 방문할 수 있는 점이 없는 경우 종료한다. 

    정점 번호는 1번부터 N번까지이다.

     

    입력

     

    첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 

    다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 

    어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 

    입력으로 주어지는 간선은 양방향이다.

     

    출력

     

    첫째 줄에 DFS를 수행한 결과를, 그다음 줄에는 BFS를 수행한 결과를 출력한다.

    V부터 방문된 점을 순서대로 출력하면 된다.

     

    풀이

     

    주어진 그래프를 두 개의 방법으로 각각 순회한 결과를 출력하는 문제이다.

     

    일종의 중간정리 같은 느낌으로 풀었는데, 막연히 DFS가 더 직관적이라 생각했는데

     

    풀다 보니 그렇지도 않다는 것을 슬슬 느끼고 있다.

     

    문제는 별 다를 게 없다. 바로 답으로 가자.

     

    Java

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayDeque;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.StringTokenizer;
    
    public class Prob1260 {
    
    	static List<Integer>[] graph;
    	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());
    
    		graph = new ArrayList[n + 1];
    
    		for (int i = 1; i <= n; i++) {
    			graph[i] = new ArrayList<>();
    		}
    
    		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].add(y);
    			graph[y].add(x);
    		}
    
    		for (int i = 1; i <= n; i++) {
    			Collections.sort(graph[i]);
    		}
    
    		visited = new boolean[n + 1];
    		dfs(v);
    		System.out.println();
    
    		visited = new boolean[n + 1];
    		bfs(v);
    	}
    
    	private static void dfs(int node) {
    		visited[node] = true;
    		System.out.print(node + " ");
    		for (int i : graph[node]) {
    			if (!visited[i]) {
    				dfs(i);
    			}
    		}
    	}
    
    	private static void bfs(int node) {
    		ArrayDeque<Integer> queue = new ArrayDeque<>();
    		queue.offer(node);
    		visited[node] = true;
    		while (!queue.isEmpty()) {
    			int v = queue.poll();
    			System.out.print(v + " ");
    			for (int i : graph[v]) {
    				if (!visited[i]) {
    					queue.offer(i);
    					visited[i] = true;
    				}
    			}
    		}
    	}
    }

     

    Python

     

    from collections import deque
    import sys
    
    sys.setrecursionlimit(10**6)
    
    n, m, v = map(int, sys.stdin.readline().rstrip().split(" "))
    graph = [[] for _ in range(n + 1)]
    
    
    def dfs(node, visited):
        visited[node] = True
        print(str(node), end=" ")
        for i in sorted(graph[node]):
            if not visited[i]:
                dfs(i, visited)
    
    
    def bfs(node, visited):
        queue = deque()
        queue.append(node)
        visited[node] = True
        while queue:
            v = queue.popleft()
            print(str(v), end=" ")
            for i in sorted(graph[v]):
                if not visited[i]:
                    queue.append(i)
                    visited[i] = True
    
    
    for i in range(m):
        x, y = map(int, sys.stdin.readline().rstrip().split(" "))
    
        graph[x].append(y)
        graph[y].append(x)
    
    dfs_result = []
    visited = [False] * (n + 1)
    dfs(v, visited)
    print(" ".join(dfs_result))
    
    bfs_result = []
    visited = [False] * (n + 1)
    bfs(v, visited)
    print(" ".join(bfs_result))

     

    Performance

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2025/01   »
    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
    글 보관함