본문 바로가기

PS

[BOJ]1976번 : 여행 가자

https://www.acmicpc.net/problem/1976

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

분류 : DisJoint-Set

 

더보기
import java.io.*;
import java.math.*;
import java.util.*;

class MyScanner {
    BufferedReader br;
    StringTokenizer st;

    public MyScanner() {
        br = new BufferedReader(new InputStreamReader(System.in));
    }

    String next() {
        while (st == null || !st.hasMoreElements()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return st.nextToken();
    }

    int nextInt() {
        return Integer.parseInt(next());
    }

    long nextLong() {
        return Long.parseLong(next());
    }

    double nextDouble() {
        return Double.parseDouble(next());
    }
}

public class Main {

    static PrintWriter out;
    //root[a] = b -> a의 부모는 b이다.
    static int[] root = new int[1001];
    public static void main(String[] args) throws IOException {
        MyScanner sc = new MyScanner();
        out = new PrintWriter(new BufferedOutputStream(System.out));
        int N = sc.nextInt();
        int M = sc.nextInt();
        // root 초기화
        for (int i = 1; i <= N; i++)
        {
            root[i] = i;
        }
        
        for(int A = 1;A<=N;A++)
        {
            for(int B = 1;B<=N;B++)
            {
                int num =sc.nextInt();
                if(num ==1)
                {
                    Union(A,B);
                }
            }
        }
        int ex = sc.nextInt();
        int Test =Find(ex);
        String str = "YES";
        for(int i=0;i<M-1;i++)
        {
            int T = sc.nextInt();
            T=Find(T);
            if(T!=Test)
            {
                str= "NO";
                break;
            }
        }
        out.println(str);
        out.flush();
    }
    private static void Union(int a, int b) {
        a = Find(a);
        b = Find(b);
        if (a != b) {
            root[a] = b;
        }
    }
    private static int Find(int k) {
        //루트 노드 이면 return k
        if (k == root[k])
            return k;
        //그 외에는 자신의 루트를 찾으러 간다.
        return root[k] = Find(root[k]);

    }
}

1717번 : 집합의 표현과 마찬가지로 Union-Find 알고리즘을 이해하기에 좋은 문제

마지막 줄 여행 계획 비교 하는 부분만 주의하면 1717번 문제와 기본 틀은 거의 비슷하다.

'PS' 카테고리의 다른 글

[BOJ]10974번 : 모든 순열  (0) 2017.03.29
[BOJ]11657번 : 타임 머신  (0) 2017.03.28
[BOJ]4195번 : 친구 네트워크  (0) 2017.03.25
[BOJ]1717번 : 집합의 표현  (0) 2017.03.25
[BOJ]1788번 : 피보나치 수의 확장  (0) 2017.03.24