//换根dp
class Solution {
public:
int rootCount(vector<vector<int>>& edges, vector<vector<int>>& guesses, int k) {
int n = edges.size() + 1;
vector<vector<int>> e(n + 1);
set<pair<int,int>> mset;
for(auto &a:edges){
e[a[0]].push_back(a[1]);
e[a[1]].push_back(a[0]);
}
for(auto &a:guesses){
mset.insert({a[0],a[1]});
}
int cnt = 0,ans = 0;
function<void(int,int)> dfs = [&](int x,int fa){
for(auto &y:e[x]){
if(y == fa)continue;
cnt += mset.count({x,y});
dfs(y,x);
}
};
dfs(0,-1);
function<void(int,int,int)> redfs = [&](int x,int fa,int c){
if(c >= k){
ans++;
}
for(auto &y:e[x]){
if(y == fa)continue;
redfs(y,x,c - mset.count({x,y}) +mset.count({y,x}));
}
};
redfs(0,-1,cnt);
return ans;
}
};