10-31 10:50
- Today
- Total
													Link
													
												
											
												
												
											
									개발하는 고라니
[백준] 1976번 : 여행 가자 본문
반응형
    
    
    
  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");
    }
}반응형
    
    
    
  'Programming > 백준' 카테고리의 다른 글
| [백준] 1600번 : 말이 되고픈 원숭이 (0) | 2021.02.17 | 
|---|---|
| [백준] 11559번 : Puyo Puyo (0) | 2021.02.16 | 
| [백준] 17070번 : 파이프 옮기기 1 (0) | 2021.02.16 | 
| [백준] 2146번 : 다리 만들기 (0) | 2021.02.15 | 
| [백준] 2589번 : 보물섬 (0) | 2021.02.15 | 
			  Comments
			
		
	
               
           
					
					
					
					
					
					
				