洛谷P 3367【テンプレート】そして調査集
洛谷P 3367【テンプレート】そして調査集
タイトルの説明
問題のように、集計とクエリーの操作を完了する必要があります.
入力フォーマット
第1行は2つの整数N N N,M M Mを含み,N N N個の要素とM M個の動作が共有されていることを示す.
次にM M M行、各行は3つの整数Z i Z_を含む{i} Zi, X i Xi Xi, Y i Yi Yi.
Z i Z_{i}Zi=1の場合、X i Xi XiとY i Yi Yiが存在する集合をマージします.
Z i Z_{i}Zi=2の場合、出力X i Xi XiとY i Yi Yiが同一集合内にあるか否かは、Y Yの出力である.そうでなければN N Nを出力する.
出力フォーマット
各Z i Z_について{i}Zi=2の操作には、1行の出力があり、各行にはY YまたはYの大文字が含まれています.N N N
入出力サンプル
入力#1
出力#1
説明/ヒント
30%30%30%30%%のデータに対して、N N N≤le≤10 10 10、M≤20 Mle 20 M≤20である.
70%70%70%70%%のデータに対して、N≦100 Nle 100 N≦100、M≦1 0 3 Mle 10^3 M≦103である.
100 100%100%100%100%100%%のデータに対して、1≦N≦1 0 4 1le Nle 10^4 1≦N≦104、1≦M≦2× 1 0 5 1\le M\le 2\times10^5 1≤M≤2×105 .
コード実装
タイトルの説明
問題のように、集計とクエリーの操作を完了する必要があります.
入力フォーマット
第1行は2つの整数N N N,M M Mを含み,N N N個の要素とM M個の動作が共有されていることを示す.
次にM M M行、各行は3つの整数Z i Z_を含む{i} Zi, X i Xi Xi, Y i Yi Yi.
Z i Z_{i}Zi=1の場合、X i Xi XiとY i Yi Yiが存在する集合をマージします.
Z i Z_{i}Zi=2の場合、出力X i Xi XiとY i Yi Yiが同一集合内にあるか否かは、Y Yの出力である.そうでなければN N Nを出力する.
出力フォーマット
各Z i Z_について{i}Zi=2の操作には、1行の出力があり、各行にはY YまたはYの大文字が含まれています.N N N
入出力サンプル
入力#1
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
出力#1
N
Y
N
Y
説明/ヒント
30%30%30%30%%のデータに対して、N N N≤le≤10 10 10、M≤20 Mle 20 M≤20である.
70%70%70%70%%のデータに対して、N≦100 Nle 100 N≦100、M≦1 0 3 Mle 10^3 M≦103である.
100 100%100%100%100%100%%のデータに対して、1≦N≦1 0 4 1le Nle 10^4 1≦N≦104、1≦M≦2× 1 0 5 1\le M\le 2\times10^5 1≤M≤2×105 .
コード実装
import java.util.Scanner;
public class P3367 {
public static int n; //
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n = sc.nextInt();
int m = sc.nextInt();
int[] parent = new int[n+1];
int[] rank = new int[n+1];
init(parent,rank);
for(int i=0;i<m;i++){
int z = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
if(z == 1){
//
union_root(x,y,parent,rank);
}else if(z == 2){
//
int result = equ_root(x,y,parent);
if(result == 0){
System.out.println("Y");
}else{
System.out.println("N");
}
}
}
}
public static void init(int parent[], int rank[]){
for(int i=1;i<=n;i++){
//
parent[i] = -1;
rank[i] = 0;
}
}
public static int find_root(int x ,int parent[]){
int x_root = x; //
while(parent[x_root] != -1){
x_root = parent[x_root];
}
return x_root;
}
/*
0- , 1-
*/
public static int equ_root(int x, int y, int parent[]){
int x_root = find_root(x,parent);
int y_root = find_root(y,parent);
if(x_root == y_root){
return 0;
}else{
return 1;
}
}
/* */
public static void union_root(int x, int y, int parent[], int rank[]){
int x_root = find_root(x,parent);
int y_root = find_root(y,parent);
if(x_root != y_root){
if(rank[x_root] > rank[y_root]){
parent[y_root] = x_root;
}else if(rank[x_root] < rank[y_root]){
parent[x_root] = y_root;
}else{
parent[x_root] = y_root;
rank[y_root]++;
}
}
}
}