ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 17352. 여러분의 다리가 되어 드리겠습니다!
    알고리즘/백준 2022. 10. 23. 15:31
    https://www.acmicpc.net/problem/17352
     

    17352번: 여러분의 다리가 되어 드리겠습니다!

    선린월드에는 N개의 섬이 있다. 섬에는 1, 2, ..., N의 번호가 하나씩 붙어 있다. 그 섬들을 N - 1개의 다리가 잇고 있으며, 어떤 두 섬 사이든 다리로 왕복할 수 있다. 어제까지는 그랬다. "왜 다리

    www.acmicpc.net

    문제

    선린월드에는 N개의 섬이 있다. 섬에는 1, 2, ..., N의 번호가 하나씩 붙어 있다. 그 섬들을 N - 1개의 다리가 잇고 있으며, 어떤 두 섬 사이든 다리로 왕복할 수 있다.

    어제까지는 그랬다.

    "왜 다리가 N - 1개밖에 없냐, 통행하기 불편하다"며 선린월드에 불만을 갖던 욱제가 다리 하나를 무너뜨렸다! 안 그래도 불편한 통행이 더 불편해졌다. 서로 왕복할 수 없는 섬들이 생겼기 때문이다. 일단 급한 대로 정부는 선린월드의 건축가를 고용해, 서로 다른 두 섬을 다리로 이어서 다시 어떤 두 섬 사이든 왕복할 수 있게 하라는 지시를 내렸다.

    그런데 그 건축가가 당신이다! 안 그래도 천하제일 코딩대회에 참가하느라 바쁜데...

    입력

    첫 줄에 정수 N이 주어진다. (2 ≤ N ≤ 300,000)

    그 다음 N - 2개의 줄에는 욱제가 무너뜨리지 않은 다리들이 잇는 두 섬의 번호가 주어진다.

    출력

    다리로 이을 두 섬의 번호를 출력한다. 여러 가지 방법이 있을 경우 그 중 아무거나 한 방법만 출력한다.

    LOGIC

    1. 다리가 무너지지 않은 섬 끼리 Union을 통해 집합을 구성한다.
    2. find를 통해 두 집합의 Root를 구하면 모든 섬을 연결할 수 있다.

    CODE

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    /**
     * 백준 17352. 여러분의 다리가 되어 드리겠습니다! - 골드 5
     * @category 분리 집합
     */
    public class Main {
    	static int N, parents[];
    	
    	public static void main(String[] args) throws Exception {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st;
    		
    		N = Integer.parseInt(br.readLine()); //섬 수
    		parents = new int[N+1];
    		for (int i = 1; i <= N; i++) {
    			parents[i] = i;
    		}
    		
    		//연결된 섬
    		for (int i = 0; i < N-2; i++) {
    			st = new StringTokenizer(br.readLine());
    			union(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
    		}
    		
    		//연결되지 않은 두 다리 찾기 - 집합의 루트
    		StringBuilder sb = new StringBuilder();
    		for (int i = 1; i <= N; i++) {
    			if(find(i) == i)
    				sb.append(i).append(' ');
    		}
    		
    		System.out.println(sb);
    	}
    	
    	static void union(int a, int b) {
    		int ar = find(a);
    		int br = find(b);
    		
    		if(ar == br) return;
    		
    		parents[br] = ar;
    	}
    	
    	static int find(int a) {
    		if(parents[a] == a)
    			return a;
    		
    		return parents[a] = find(parents[a]);
    	}
    }

     

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

    1956. 운동  (0) 2022.10.30
    11403. 경로 찾기  (0) 2022.10.30
    1854. K번째 최단경로 찾기  (0) 2022.10.06
    9370. 미확인 도착지  (0) 2022.10.06
    2887. 행성 터널  (0) 2022.10.02

    댓글

Designed by Tistory.