#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, k; cin >> n >> m >> k;
vector<vector<pair<int, int>>> adj(n);
for (int i = 0; i < n - 1; ++i) {
int a, b; cin >> a >> b;
adj[--a].push_back({--b, i});
adj[b].push_back({a, i});
}
vector<vector<int>> here(n);
vector<int> c(m);
for (int i = 0; i < m; ++i) {
cin >> c[i];
for (int j = 0; j < c[i]; ++j) {
int v; cin >> v;
here[--v].push_back(i);
}
}
vector<set<pair<int, int>>> at(n);
vector<int> ans;
auto dfs = [&](auto&& self, int node, int p) -> void {
for (int i : here[node]) {
at[node].insert({i, 1});
}
for (pair<int, int>& i : adj[node]) {
if (i.first == p) continue;
self(self, i.first, node);
if (at[i.first].size() >= k) {
ans.push_back(i.second);
}
if (at[node].size() < at[i.first].size()) swap(at[node], at[i.first]);
for (pair<int, int> j : at[i.first]) {
auto it = at[node].lower_bound({j.first, 0});
if (it == at[node].end() || it->first != j.first) {
at[node].insert(j);
} else {
int tc = j.second + it->second;
at[node].erase(it);
if (tc != c[j.first]) at[node].insert({j.first, tc});
}
}
at[i.first].clear();
}
};
dfs(dfs, 0, -1);
sort(ans.begin(), ans.end());
cout << ans.size() << '\n';
for (int i : ans) {
cout << i + 1 << ' ';
}
cout << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |