반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 1976번 : 여행 가자 본문

Programming/백준

[백준] 1976번 : 여행 가자

조용한고라니 2021. 2. 16. 14:59
반응형
 

1976번: 여행 가자

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

www.acmicpc.net


[Union-Find]

입력은 인접 행렬 형태로 주어지지만, 크루스칼 알고리즘을 사용할 때 처럼 모든 간선의 정보를 하나의 리스트에 담았고, 이 리스트를 가지고 유니온 파인드를 하여 서로 연결된 그래프라면 연결시켰다.

 

그리고 입력으로 주어진 m개의 여행 도시 배열의 각 원소의 부모가 첫 번째 원소의 부모와 다르다면 이 여행 순서는 이루어질 수 없으므로 "NO"를 출력한다.

# Code </>

public class Main {

    static class Edge{
        int h, tg;
        public Edge(int home, int target){
            h=home;
            tg=target;
        }
    }
    static List<Edge> list = new ArrayList<>();
    static int[] trip = new int[1001], parent = new int[201];

    static int getParent(int x){
        if(parent[x] == x) return x;
        return parent[x] = getParent(parent[x]);
    }
    static boolean findParent(int a, int b){
        a = getParent(a);
        b = getParent(b);

        return a == b? true : false;
    }
    static void unionParent(int a, int b){
        a = getParent(a);
        b = getParent(b);

        if(a < b) parent[b] = a;
        else parent[a] = b;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());

        for(int i=1; i<=n; i++)
            parent[i] = i;

        for(int i=1; i<=n; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=1; j<=n; j++){
                String s = st.nextToken();
                if(!s.equals("0"))
                    list.add(new Edge(i, j));
            }
        }

        st = new StringTokenizer(br.readLine());
        for(int i=1; i<=m; i++)
            trip[i] = Integer.parseInt(st.nextToken());

        for(Edge e : list){
            if(!findParent(e.h, e.tg))
                unionParent(e.h, e.tg);
        }

        boolean flag = true;

        for(int a=2; a<=m; a++)
            if(!findParent(trip[1], trip[a]))
                flag = false;

        System.out.println(flag?"YES":"NO");
    }
}
반응형
Comments