#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int64_t oo = 1e9;
#define int long long
#define float long double
#define quickly ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define FOR(I, L, R) for(int I(L) ; I <= (int)R ; ++I)
#define FOD(I, R, L) for(int I(R) ; I >= (int)L ; --I)
#define FOA(I, A) for(auto I : A)
#define print(A,L,R) FOR(OK, L, R){if(A[OK]<=-oo||A[OK]>=oo)cout<<"- ";else cout<<A[OK]<<' ';}cout<<'\n';
#define prints(A) FOA(OK, A){cout<<OK<<' ';}cout << '\n';
#define printz(A,L,R) FOR(OK, 0, L){FOR(KO, 0, R){if(A[OK][KO]>-oo&&A[OK][KO]<oo)cout<<A[OK][KO]<<' ';else cout << "- ";} cout << '\n';}cout << '\n';
#define fs first
#define sd second
#define th second.second
#define ii pair<int,int>
#define iii pair<int, ii>
#define all(A) A.begin(), A.end()
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
int n, m, k, el;
int up[N][20], h[N], st[N];
int lazy[N], edge[N];
vector<ii> g[N];
void DFS(int u, int par){
st[u] = ++el;
FOA(e, g[u]){
int v = e.fs, w = e.sd;
if(v == par){
continue;
}
edge[v] = w;
h[v] = h[u] + 1;
up[v][0] = u;
FOR(i, 1, 17){
up[v][i] = up[up[v][i - 1]][i - 1];
}
DFS(v, u);
}
}
int LCA(int u, int v){
if(h[u] > h[v]) swap(u, v);
int c = h[v] - h[u];
FOR(i, 0, 17){
if(c >> i & 1){
v = up[v][i];
}
}
if(u == v) return u;
FOD(i, 17, 0){
if(up[v][i] == up[u][i]){
continue;
}
v = up[v][i];
u = up[u][i];
}
return up[v][0];
}
void add(int u, int v){
lazy[u]++; lazy[v]++;
lazy[LCA(u, v)] -= 2;
}
void DFS_DP(int u, int par){
FOA(e, g[u]){
int v = e.fs;
if(v == par){
continue;
}
DFS_DP(v, u);
lazy[u] += lazy[v];
}
}
signed main(){ quickly
cin >> n >> m >> k;
FOR(i, 1, n - 1){
int u, v;
cin >> u >> v;
g[u].push_back({v, i});
g[v].push_back({u, i});
}
DFS(1, -1);
while(m--){
int s; cin >> s;
vector<int> pos;
FOR(i, 1, s){
int v; cin >> v;
pos.push_back(v);
}
sort(all(pos), [&](int &u, int &v){
return st[u] < st[v];
});
pos.push_back(pos[0]);
FOR(i, 0, s - 1){
add(pos[i], pos[i + 1]);
}
}
DFS_DP(1, -1);
vector<int> ans;
FOR(i, 2, n){
if(lazy[i] >= 2 * k){
ans.push_back(edge[i]);
}
}
sort(all(ans));
cout << ans.size() << '\n';
prints(ans);
}
# | 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... |