Link:
https://www.nowcoder.com/acm/contest/106/C
Source: Niuke.com
Source: Niuke.com
Topic description
It’s universally acknowledged that there’re innumerable trees in the campus of HUST.
Thus a professional tree manager is needed. Your task is to write a program to help manage the trees.
Initially, there are n forests and for the i-th forest there is only the i-th tree in it. Given four kinds of operations.
1 u v, merge the forest containing the u-th tree and the forest containing the v-th tree;
2 u, separate the u-th tree from its forest;
3 u, query the size of the forest which contains the u-th tree;
4 u v, query whether the u-th tree and the v-th tree are in the same forest.
Enter description:
The first line contains an integer T, indicating the number of testcases.
In each test case:
The first line contains two integers N and Q, indicating the number of initial forests and the number of operations.
Then Q lines follow, and each line describes an operation.
Output description:
For each test cases, the first line should be "Case #i:", where i indicate the test case i. For each query 3, print a integer in a single line. For each query 4, print "YES" or "NO" in a single line.
Solution: Number each node, and then use the number to query the query.
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 7; int par[maxn], id[maxn], cnt[maxn]; int find(int x) { return x==by[x]? x : par[x] = find(par[x]); } intmain() { //freopen("f:\\zxc.txt","w",stdout); int T, Case = 0; scanf("%d", &T); while(T --) { memset(cnt, 0, sizeof(cnt)); int n, q; printf("Case #%d:\n", ++Case); scanf("%d %d", &n, &q); for(int i = 1;i <= n;i ++) cnt[i] = 1, id[i] = par[i] = i; int vir = n + 1; while(q --) { int opt; scanf("%d", &opt); if(opt == 1) { int u, v; scanf("%d %d", &u, &v); u = find(id[u]); v = find(id[v]); if(u == v) continue; par[u] = v; cnt[v] += cnt[u]; cnt[u] = 0; } else if(opt == 2) { you and; scanf("%d", &u); int paru = find(id[u]); cnt[released] --; id [u] = for ++; cnt[id[u]] = 1; par [id [u]] = id [u]; } else if(opt == 3) { you and; scanf("%d", &u); u = id [u]; printf("%d\n", cnt[find(u)]); } else { int u, v; scanf("%d %d", &u, &v); puts(find(id[u]) == find(id[v]) ? "YES" : "NO"); } } } return 0; }