Dev.baelanche

[백준 4803] 트리 본문

Data Structure & Algorithm/PS - JAVA

[백준 4803] 트리

baelanche 2019. 5. 27. 21:10
반응형

 

트리의 성질을 이용하여 풀어야하는 문제이다.

 

1. 입력값으로 트리를 만든다.

2. DFS 를 통해 컴포넌트 별로 간선 개수, 노드 개수를 각각 구한다.

3. 노드 개수 - 1 = 간선 개수 를 만족해야 트리이다.

4. 양방향으로 구현하였으므로 간선/2 를 해주었다.

 

 

public class Main {
    
    static int tree[][];
    static boolean visited[];
    static boolean vertexes[];
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        for(int c=1; true; c++) {
            String nm[] = br.readLine().split(" ");
            int n = Integer.parseInt(nm[0]);
            int m = Integer.parseInt(nm[1]);
            if(n == 0 && m == 0) break;
            
            tree = new int[n+1][n+1];
            visited = new boolean[n+1];
            vertexes = new boolean[n+1];
            for(int i=0; i<m; i++) {
                String uv[] = br.readLine().split(" ");
                int u = Integer.parseInt(uv[0]);
                int v = Integer.parseInt(uv[1]);
                tree[u][v] = v;
                tree[v][u] = u;
            }
            
            int result = 0;
            for(int i=1; i<=n; i++) {
                if(!visited[i]) {
                    int v = vertex(i);
                    int e = edge(i);
                    if(v-1 == e/2) result++;
                }
            }
            System.out.println(result == 0 ?
                              "Case " + c + ": No trees." : result == 1 ?
                              "Case " + c + ": There is one tree." :
                              "Case " + c + ": A forest of " + result + " trees.");
        }
    }
    
    public static int vertex(int node) {
        int cnt = 1;
        visited[node] = true;
        
        for(int i=1; i<tree.length; i++) {
            int child = tree[node][i];
            if(child != 0 && !visited[child])
                cnt += vertex(child);
        }
        return cnt;
    }
    
    public static int edge(int node) {
        int cnt = 0;
        for(int i=1; i<tree.length; i++) {
            if(tree[node][i] != 0) cnt++;
        }
        vertexes[node] = true;
        
        for(int i=1; i<tree.length; i++) {
            int child = tree[node][i];
            if(child != 0 && !vertexes[child])
                cnt += edge(child);
        }
        return cnt;
    }
}
반응형

'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글

[백준 16437] 양 구출 작전  (0) 2019.05.27
[백준 1068] 트리  (0) 2019.05.27
[백준 11725] 트리의 부모 찾기  (0) 2019.05.27
[백준 1991] 트리 순회  (0) 2019.05.27
[백준 2014] 소수의 곱  (0) 2019.05.22
Comments