어흥

[백준 4803] 트리 (Java) 본문

알고리즘/백준

[백준 4803] 트리 (Java)

라이언납시오 2021. 4. 2. 18:39
728x90
반응형

문제 링크: www.acmicpc.net/problem/4803

 

4803번: 트리

입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다.

www.acmicpc.net

1. 주의할 점

- 모든 TC가 진행되기 전, 변수를 초기화한다

- 트리가 이뤄지지 않은 Node는 무시한다 → 무조건 Tree가 없다고 하면 WA

 

2. 구현

- 트리의 특징인 노드 N개 → 간선 N-1개를 통해 MST를 떠올린다(MST도 똑같이 노드 N개, 간선 N-1개)

- 트리가 많을 수 있기 때문에 MST의 방법중 하나인 유니온 파인드를 사용한다

- Par[] 함수를 통해 각 Node의 부모(속한 트리의 번호)를 저장한다

- finP() 함수를 통해 각 Node가 속한 Tree의 번호를 갱신 및 반환한다

- Make_union(a,b) 함수를 통해 Node A와 B를 연결 시도한다. 이미 같은 트리인 경우, 각 부모를 0으로 초기화한다

- 모든 간선에 대한 정보를 다 입력받았으면 HashSet을 통해 트리의 총 개수를 구해서 이에 해당하는 문구를 출력한다

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
    static int node,edge;
    static int par[];
    static HashSet<Integer> hs;
    
    static int findP(int x){
        if(par[x]==x) return x;
        return par[x] = findP(par[x]);
    }
    
    static void make_union(int a,int b){
        int pa = findP(a);
        int pb = findP(b);
        if(pa==pb){     //이미 같은 트리
            par[pb] = pa;
            par[pa] = 0;
        }
        else if(pa<pb) par[pb] = pa;
        else par[pa] = pb;
    }
    
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    int a,b,test=1;
	    while(true){
	        String ss = br.readLine();
    	    StringTokenizer st = new StringTokenizer(ss);
    	    node = Integer.parseInt(st.nextToken());
    	    edge = Integer.parseInt(st.nextToken());
    	    if(node==0 && edge==0) break;
    	    
    	    //초기화
    	    par = new int[node+1];
    	    for(int i=1;i<=node;i++)
    	        par[i]=i;   	    
    	    hs = new HashSet<>();
    	    
    	    for(int i=0;i<edge;i++){
    	        ss = br.readLine();
    	        st = new StringTokenizer(ss);
    	        a = Integer.parseInt(st.nextToken());
    	        b = Integer.parseInt(st.nextToken());
    	        make_union(a,b);
    	    }
    	    for(int i=1;i<=node;i++){
    	        int pi = findP(i);
    	        if(pi>0)
    	            hs.add(pi);
    	    }
    	    if(hs.isEmpty())
    	        System.out.println("Case "+test+": No trees.");
    	    else if(hs.size()==1)
    	        System.out.println("Case "+test+": There is one tree.");
    	    else
    	        System.out.println("Case "+test+": A forest of "+hs.size()+" trees.");
    	    test++;
	    }
	}
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2479] 경로 찾기 (Java)  (0) 2021.04.02
[백준 14395] 4연산 (Java)  (0) 2021.04.02
[백준 3584] 가장 가까운 공통 조상 (Java)  (0) 2021.04.01
[백준 14867] 물통 (Java)  (0) 2021.04.01
[백준 15971] 두 로봇 (Java)  (0) 2021.03.31
Comments