#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int dp[20][MAXN], sum[MAXN];
int pre[MAXN], pos[MAXN];
vector<int> adj[MAXN];
int t = 0;
void dfs_0(int v, int p){
pre[v] = ++t;
for(auto u : adj[v]){
if(u != p){
dp[0][u] = v;
dfs_0(u, v);
}
}
pos[v] = t;
}
void dfs_1(int v, int p){
for(auto u : adj[v]){
if(u != p){
dfs_1(u, v);
sum[v] += sum[u];
}
}
}
int sub(int a, int b){
return pre[b] <= pre[a] && pos[a] <= pos[b];
}
int lca(int a, int b){
if(sub(b, a)) return a;
if(sub(a, b)) return b;
for(int k=19; k>=0; k--){
if(!sub(dp[k][b], a)){
b = dp[k][b];
}
}
return dp[0][b];
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int n, m, k; cin >> n >> m >> k;
vector<pair<int, int>> edges;
for(int i=1; i<n; i++){
int a, b; cin >> a >> b;
edges.push_back({a, b});
adj[a].push_back(b);
adj[b].push_back(a);
}
dp[0][1] = 0;
dfs_0(1, 1);
for(int k=1; k<20; k++){
for(int i=1; i<=n; i++){
dp[k][i] = dp[k - 1][dp[k - 1][i]];
}
}
while(m--){
int s; cin >> s;
vector<int> vtx(s);
for(int i=0; i<s; i++) cin >> vtx[i];
for(int i=1; i<s; i++){
int c = lca(vtx[i - 1], vtx[i]);
sum[dp[0][c]] -= 2;
sum[vtx[i - 1]] ++;
sum[vtx[i]] ++;
}
}
dfs_1(1, 1);
vector<int> ans;
for(int i=0; i<(int) edges.size(); i++){
if(sum[edges[i].first] >= k && sum[edges[i].second] >= k){
ans.push_back(i + 1);
}
}
cout << (int) ans.size() << "\n";
for(auto x : ans) cout << x << " ";
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... |