본문 바로가기

알고리즘/백준

[백준] 1976 여행가자

문제링크 : www.acmicpc.net/problem/1976

 

1976번: 여행 가자

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

www.acmicpc.net

여행지가 연결되었는 지만 알면 되기 때문에 disjoint set으로 해결 가능하다.

import java.io.*;
import java.util.*;
public class Main {
	public static int N,M;
	public static int [][]adj;
	public static int par[];
	
	public static void init() {
		for(int i=1;i<=N;i++) {
			par[i] = i;
		}
	}
	
	public static int find(int x) {
		if(par[x] == x) return x;
		return par[x] = find(par[x]);
	}
	public static void union(int x,int y) {
		int a= find(x);
		int b = find(y);
		if(a!=b) {
			par[a] = b;
		}
	}
	public static void allUnion() {
		for(int i=1;i<=N;i++) {
			for(int j=1;j<=N;j++) {
				if(i==j) continue;
				if(adj[i][j]==1) {
					union(i,j);
				}
			}
		}
	}
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		M = Integer.parseInt(br.readLine());
		adj = new int[N+1][N+1];
		par = new int[N+1];
		init();
		StringTokenizer st;
		for(int i=1;i<=N;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=1;j<=N;j++) {
				adj[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		allUnion();
		st = new StringTokenizer(br.readLine());
		int query[] = new int[M];
		for(int i=0;i<M;i++) {
			query[i] = Integer.parseInt(st.nextToken());
		}
		boolean suc = true;
		for(int i=0;i<M-1;i++) {
			if(find(query[i])!=find(query[i+1])) {
				suc = false;
				break;
			}
		}
		if(suc) {
			System.out.println("YES");
		}else {
			System.out.println("NO");
		}
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2169 로봇 조종하기[JAVA]  (5) 2021.02.24
[백준] 14267 회사 문화1  (0) 2021.02.15
[백준] 1963 소수 경로  (0) 2021.02.15
[백준] 1744 수 묶기  (0) 2021.02.15
[백준] 14226 이모티콘 [JAVA]  (0) 2021.02.15