본문 바로가기
백준알고리즘

백준 1976 여행 가자 JAVA Union-Find

by tiit 2020. 7. 8.
반응형

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_1976 {

public static void main(String[] args) throws NumberFormatException, IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st ;

    int N = Integer.parseInt(br.readLine());
    int M = Integer.parseInt(br.readLine());
    int plan[] = new int [M];
    int parent[] = new int[N+1];

    for(int i=1; i<=N; i++) {
        parent[i] = i; //parent 배열에 1부터 N까지 저장 
    }

    for(int i=1; i<=N; i++) {
        st = new StringTokenizer(br.readLine());
        for(int j=1; j<=N; j++) {
            int num = Integer.parseInt(st.nextToken());

            if(num == 1) { //연결됐을 때 
                Union(parent, i, j); //연결 해줌 
            }
        }
    }

    for(int i=0; i<M; i++) {
        st = new StringTokenizer(br.readLine());
        plan[i] = Integer.parseInt(st.nextToken());
    }

    boolean flag = true; //갈 수 있는 플랜인지 판별 하는 변수 
    for(int i=0; i<M-1; i++) { //도시가 3개면 2개만 판별해도 알 수 있다 
        if(!Find(parent, plan[i], plan[i+1])) { //부모노드가 다르면
            flag = false;
            break;
        }
    }

    if(flag) {
        System.out.println("YES");
    }else {
        System.out.println("NO");
    }

}

private static int getParent(int[] parent, int a) {

    if(parent[a] == a) {
        return a;
    }else {
        return parent[a] = getParent(parent, parent[a]); //부모노드랑 자식노드가 다르면
                                                    //다시 getParent를 현재 부모노드를 찾아서 
                                                //그 부모노드의 부모노드가 최종 부모노드가 된다,,
    }
}

private static boolean Find(int[] parent, int a, int b) {

    int parent1 = getParent(parent, a);
    int parent2 = getParent(parent, b); 

    if(parent1 == parent2) {
        return true;
    }else {
        return false;
    }

}

private static void Union(int[] parent, int a, int b) {

    int parent1 = getParent(parent, a);
    int parent2 = getParent(parent, b);

    if(parent1 <= parent2) { //1 2
        parent[parent2] = parent1; // parent[2] = 1 -> 2의 부모노드는 1이다. 
    }else {
        parent[parent1] = parent2; 
    }
}

}

// 복습 또 복습 ~!

반응형

댓글