CF1843D Apple Tree (dfs路径数量)
题意:树上的一个节点,递归落出其中一个叶子节点,能有多少种落出方案。
//树的dfs遍历,不用开vis数组,直接再dfs形参中+fa
//图的dfs遍历,要开vis数组,因为可能会有环
** 用一个du[]数组,来表示一个节点的出边,出边为1的就是叶子节点(根节点除外),树的递归,就在dfs的形参上用一个fa,防止树反向递归。**
** 在到达了叶子节点,就返回1,u节点的for枚举递归,最后返回后,一直返回,就能得到一个节点的落出方案书**
正解:
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+9;
vector<int>G[N];
vector<int>du(N+1,0),a(N+1,0);
int dfs(int x,int fa){
if(du[x]==1 && x!=1){//到达叶子结点 && 排除根节点
a[x]=1;
return a[x];
}
for(int i=0;i<G[x].size();i++){
if(G[x][i]==fa) continue;//父节点以上不访问
a[x]+=dfs(G[x][i],x);
}
return a[x];
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++){//int i=1;i<=n
G[i].clear();
}
for(int i=0;i<n-1;i++){//int i=1;i<n
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
du[u]++,du[v]++;
}
dfs(1,1);
int q;
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
cout<<a[u]*a[v]<<'\n';
}
}
signed main()
{
int t;
cin>>t;
while(t--){
fill(du.begin(),du.end(),0);
fill(a.begin(),a.end(),0);
solve();
}
return 0;
}