12012번: Closing the Farm (Gold)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static public int[] parent;
static public int[] size;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
parent = new int[n+1];
size = new int[n+1];
ArrayList<Integer>[] adj = new ArrayList[n+1];
for(int i = 0; i<n+1; i++){
parent[i] = i;
size[i] = 1;
adj[i] = new ArrayList<>();
}
for(int i = 0; i<m; i++){
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
adj[a].add(b);
adj[b].add(a);
}
int[] query = new int[n];
for(int i = 0; i<n; i++){
query[i] = Integer.parseInt(br.readLine());
}
Stack<Boolean> result = new Stack<>();
boolean[] visited = new boolean[n+1];
int farm = 0;
for(int i = n-1; i>=0; i--){
int cur = query[i];
visited[cur] = true;
farm++;
for(int next : adj[cur]){
if(!visited[next]) continue;
union(cur, next);
}
if(farm == size[find(cur)]) result.push(true);
else result.push(false);
}
int size = result.size();
for(int i = 0; i<size; i++){
boolean check = result.pop();
System.out.println(check ? "YES" : "NO");
}
}
public static int find(int a){
if(parent[a] == a) return a;
return parent[a] = find(parent[a]);
}
public static void union(int a, int b){
int parent_a = find(a);
int parent_b = find(b);
if(parent_a != parent_b){
if(parent_a < parent_b){
parent[parent_b] = parent_a;
size[parent_a] += size[parent_b];
}
else{
parent[parent_a] = parent_b;
size[parent_b] += size[parent_a];
}
}
}
}