2581. 统计可能的树根数目
题目链接:2581. 统计可能的树根数目
代码如下:
//树形动态规划
//参考:leetcode官方题解
class Solution {
public:
int rootCount(vector<vector<int>>& edges, vector<vector<int>>& guesses, int k) {
vector<vector<int>> g(edges.size()+1);
unordered_set<long long> st;
for(auto &v:edges)
{
g[v[0]].push_back(v[1]);
g[v[1]].push_back(v[0]);
}
auto h=[&](int x,int y)->long long
{
return (long long)x<<20|y;
};
for(auto& v:guesses)
{
st.insert(h(v[0],v[1]));
}
int count=0,res=0;
function<void(int,int)> dfs=[&](int x,int fat)->void
{
for(auto& y:g[x])
{
if(y==fat)
continue;
count+=st.count(h(x,y));
dfs(y,x);
}
};
dfs(0,-1);
function<void(int,int,int)> redfs=[&](int x,int fat,int count)
{
if(count>=k)
res++;
for(auto &y:g[x])
{
if(y==fat)
continue;
redfs(y,x,count-st.count(h(x,y))+st.count(h(y,x)));
}
};
redfs(0,-1,count);
return res;
}
};