문제 풀이 및 개발 공간

[백준] 1976번 여행 가자 (gold 4 본문

백준공부/java

[백준] 1976번 여행 가자 (gold 4

gomduri43 2024. 3. 13. 19:29

import java.io.*;
import java.util.*;
public class Main{
    static int[] num;
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        int n=Integer.valueOf(br.readLine());
        int m=Integer.valueOf(br.readLine());

        num=new int[n+1];
        for(int i=1; i<=n; i++){
            num[i]=i;
        }

        int[][] map=new int[n+1][n+1];
        for(int i=1; i<=n; i++){
            st=new StringTokenizer(br.readLine());
            for(int j=1; j<=n; j++){
                map[i][j]=Integer.valueOf(st.nextToken());
            }
        }
		
        //유니온을 써서 그래프 정점들간의 관계
        //겹칠애들 겹침
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                if(map[i][j]==1){
                    Union(i,j);
                }
            }
        }

        st=new StringTokenizer(br.readLine());
        boolean is=true;
        int temp=num[Find(Integer.valueOf(st.nextToken()))];
        for(int i=1; i<m; i++){
            int t=Integer.valueOf(st.nextToken());
            //Find가 결국 부모를 반환하므로 이를 이용해서 최초의 부모와 계속 같은지
            if(temp!=Find(num[t])){
                is=false;
                break;
            }
        }
        bw.write(is ? "YES" : "NO");
        bw.flush();

    }

    public static int Find(int v){
        if(v==num[v]){
            return v;
        }
        else{
            return v=Find(num[v]);
        }
    }

    public static void Union(int a, int b){
        int fa=Find(a);
        int fb=Find(b);
        if(fa!=fb){
            num[fa]=fb;
        }
    }
}

//유니온 파인드를 사용하면 간단하게 해결가능한 문제.
//유니온 파인드를 연습하려고 해결한 문제.