문제출저
https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
소스코드
package studyGroup.June.june13;
import java.util.*;
import java.lang.*;
import java.io.*;
/*
유니온파인드드
반례
4
4
0 0 0 1
0 0 1 0
0 1 0 1
1 0 1 0
3 1 2 4
*/
public class 백준1976번여행가자 {
static int n; // 도시의 수
static int m; // 여행 계획에 속한 도시의 수
static int[][] board;
static int[] trip;
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
board = new int[n+1][n+1];
m = Integer.parseInt(br.readLine());
trip = new int[m];
for(int i = 1; i <= n; i++)
{
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 1; j <= n; j++)
{
board[i][j] = Integer.parseInt(st.nextToken());
}
}
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < m; i++)
{
trip[i] = Integer.parseInt(st.nextToken());
}
// 유니온 파인드
parent = new int[n+1];
for(int i = 1; i <= n; i++)
{
parent[i] = i;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(board[i][j] == 1)
{
union(i,j);
}
}
}
// for(int i = 0; i <= n; i++)
// {
// System.out.println(Arrays.toString(board[i]));
// }
// System.out.println();
// System.out.println(Arrays.toString(parent));
// 정답 출력
if(m <= 1)
{
System.out.println("YES");
return;
}
int check = find(trip[0]);
for(int i = 1; i < m; i++)
{
if(check != find(trip[i]))
{
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
static int find(int x)
{
if(parent[x] == x)
{
return x;
}
int y = find(parent[x]);
parent[x] = y;
return y;
}
static void union(int x, int y)
{
x = find(x); // x를 이용하면 된다 굳이 findx를 이용할 필요가 없다.
y = find(y);
if(x != y)
{
if(x < y)
{
parent[y] = x;
}
else
{
parent[x] = y;
}
}
return;
}
}