• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yongchaoD

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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;
}

posted on 2024-07-06 15:09  yongchaoD  阅读(15)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3