#include #include #include #define MAX 100005 using namespace std; vector> graph; int islands[MAX]; class UnionFind { private: vector p, rank; public: int sets; UnionFind(int N) { rank.assign(N, 0); p.assign(N, 0); for (int i = 0; i < N; i++) p[i] = i; sets = N; } int findSet(int i) { if (p[i] == i) { return i; } int tmp = findSet(p[i]); p[i] = tmp; return p[i]; } bool isSameSet(int i, int j) { return findSet(i) == findSet(j); } void unionSet(int i, int j) { if (!isSameSet(i, j)) { sets--; int x = findSet(i), y = findSet(j); if (rank[x] > rank[y]) { p[y] = x; } else { p[x] = y; if (rank[x] == rank[y]) { rank[y]++; } } } } }; int main() { int V, E, P, a, b, p, id, M; scanf("%d%d%d", &V, &E, &P); for (int i = 0; i < V; i++) { graph.emplace_back(); } for (int i = 0; i < E; i++) { scanf("%d%d", &a, &b); a--; b--; graph[a].emplace_back(b); graph[b].emplace_back(a); } for (int i = 0; i < P; i++) { scanf("%d", &M); memset(islands, 0, sizeof islands); UnionFind uf(M); id = 1; for (int j = 0; j < M; j++) { scanf("%d", &p); p--; if (islands[p] != 0) { uf.unionSet(id, islands[p]); } for (int j = 0; j < graph[p].size(); j++) { islands[graph[p][j]] = id; } id++; } cout << uf.sets << endl; } return 0; }