Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define mp make_pair
- #define pb push_back
- #define sz(a) (int)(a).size()
- #define fori(i,b,e) for(int i = (b); i < (e); i++)
- #define forn(i,n) fori(i,0,n)
- #define f first
- #define s second
- typedef long long int64;
- typedef long long LL;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- int getInt() { int x; scanf("%d", &x); return x;}
- const int MAXN = 1e3 + 5;
- vi g[MAXN];
- int lca[MAXN][MAXN];
- vi who[MAXN];
- bool alive[MAXN * MAXN];
- int par[MAXN];
- vector<pii> qs;
- int n, m;
- int depth[MAXN];
- int cnt[MAXN];
- bool deleted[MAXN];
- int get_lca(int v, int u) {
- // printf("%d->%d %d->%d\n", v, par[v], u, par[u]);
- if (lca[v][u] != -1) {
- return lca[v][u];
- }
- if (depth[v] < depth[u]) {
- return lca[v][u] = get_lca(v, par[u]);
- }
- if (depth[u] < depth[v]) {
- return lca[v][u] = get_lca(par[v], u);
- }
- if (v == u) {
- return lca[v][u] = v;
- }
- return lca[v][u] = get_lca(par[v], par[u]);
- }
- void dfs(int v, int p = -1, int de = 0) {
- // printf("%d par = %d\n", v, p);
- depth[v] = de;
- par[v] = p;
- for (int to : g[v]) {
- if (to != p) {
- dfs(to, v, de + 1);
- }
- }
- }
- void dfs_delete(int v) {
- // printf("%d\n", v);
- if (deleted[v]) {
- return;
- }
- for (int id : who[v]) {
- alive[id] = false;
- }
- for (int to : g[v]) {
- if (to != par[v]) {
- dfs_delete(to);
- }
- }
- }
- int main() {
- #ifdef DEBUG
- freopen("in.txt", "rt", stdin);
- // freopen("out.txt", "wt", stdout);
- #endif
- int T;
- scanf("%d", &T);
- while (T --> 0) {
- scanf("%d", &n);
- forn(i, n - 1) {
- int v, u;
- scanf("%d%d", &v, &u);
- --v;
- --u;
- g[v].pb(u);
- g[u].pb(v);
- }
- memset (lca, -1, sizeof lca);
- dfs(0);
- scanf("%d", &m);
- forn(i, m) {
- int v, u;
- scanf("%d%d", &v, &u);
- --v;
- --u;
- qs.pb(mp(v, u));
- }
- memset (cnt, 0, sizeof cnt);
- forn(i, sz(qs)) {
- // printf("%d\n", get_lca(qs[i].f, qs[i].s));
- ++cnt[n - depth[get_lca(qs[i].f, qs[i].s)]];
- }
- for (int i = 1; i < n; ++i) {
- cnt[i] += cnt[i - 1];
- }
- vector<pii> qs_(sz(qs));
- forn(i, sz(qs)) {
- qs_[--cnt[n - depth[get_lca(qs[i].f, qs[i].s)]]] = qs[i];
- }
- qs_.swap(qs);
- forn(i, sz(qs)) {
- who[qs[i].f].pb(i);
- who[qs[i].s].pb(i);
- }
- memset (alive, true, sizeof alive);
- memset (deleted, false, sizeof deleted);
- int ans = 0;
- forn(i, sz(qs)) {
- if (alive[i]) {
- int c = get_lca(qs[i].f, qs[i].s);
- dfs_delete(c);
- ++ans;
- }
- }
- printf("%d\n", ans);
- forn(i, n) {
- who[i].clear();
- g[i].clear();
- }
- qs.clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement