三个点全WA 样例AC
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <map>
#include <complex>
#include <math.h>
#include <stack>
#include <unordered_map>
#include <set>
#include <string.h>
using namespace std;
int to[1000010], nxt[1000010], head[300010], cnt;
int dfn[100010], low[100010], d2c, dc, vis[100010];
stack<int> st;
int fa[300010], fi[300010][22], dep[300010], Dfn[300010], Dc, pf[300010];
int n;
int tmp[100010];
void add(int a, int b) {
to[++cnt] = b;
nxt[cnt] = head[a];
head[a] = cnt;
}
void tar(int u) {
dfn[u] = low[u] = ++dc;
st.push(u);
vis[u] = 1;
for (int j = head[u]; j; j = nxt[j]) {
int v = to[j];
if (!dfn[v]) {
tar(v);
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
d2c++;
int w;
yu:
w = st.top();
st.pop();
add(d2c + 2 * n, w + n);
add(w + n, d2c + 2 * n);
vis[w] = 0;
if (!st.empty() && w != u)goto yu;
vis[u] = 1;
st.push(u);
}
}
else if (vis[v]) {
low[u] = min(low[u], dfn[v]);
}
}
}
void dfs(int u, int f) {
fa[u] = f;
dep[u] = dep[f] + 1;
Dfn[u] = ++Dc;
pf[u] = pf[f] + (u <= 2 * n);
for (int j = head[u]; j; j = nxt[j])if (to[j] != f)dfs(to[j], u);
}
int lca(int x, int y) {
if (dep[x] > dep[y])swap(x, y);
for (int k = 20; k >= 0; k--)if (dep[x] <= dep[fi[y][k]])y = fi[y][k];
for (int k = 20; k >= 0; k--)if (fi[x][k] != fi[y][k])x = fi[x][k], y = fi[y][k];
if (x == y)return x;
return fa[x];
}
int cmp(int a, int b) {
return Dfn[a] < Dfn[b];
}
signed main() {
ios::sync_with_stdio(0);
int T;
cin >> T;
for (int I = 1; I <= T; I++) {
int m;
cin >> n >> m;
cnt = 0;
for (int i = 1; i <= n; i++)dfn[i] = low[i] = vis[i] = 0;
for (int i = 1; i <= 3 * n; i++)head[i] = fa[i] = dep[i] = Dfn[i] = pf[i] = 0;
d2c = dc = Dc = 0;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
while (!st.empty())st.pop();
tar(1);
//cout << d2c << endl;
//for (int i = n + 1; i <= 2 * n + d2c; i++)for (int j = head[i]; j; j = nxt[j])cout << i - n << " " << to[j] - n << "Q" << endl;
dfs(2 * n + 1, 0);
for (int i = n + 1; i <= 2 * n + d2c; i++)fi[i][0] = fa[i];
for (int k = 1; k <= 20; k++)for (int i = n + 1; i <= 2 * n + d2c; i++)fi[i][k] = fi[fi[i][k - 1]][k - 1];
int Q;
cin >> Q;
for (int J = 1; J <= Q; J++) {
int k;
cin >> k;
for (int i = 1; i <= k; i++)cin >> tmp[i], tmp[i] += n;
sort(tmp + 1, tmp + k + 1, cmp);
int ans = 0;
for (int i = 1; i <= k; i++) {
int a = tmp[i], b = tmp[i == k ? 1 : i + 1];
int l = lca(a, b);
ans += pf[a] + pf[b] - 2 * pf[l];
}
cout << ans / 2 + (lca(tmp[1], tmp[k]) <= 2 * n) - k << endl;
}
}
return 0;
}