首页 > 其他分享 >Codeforces Round #321 (Div. 2) C. Kefa and Park(树+dfs)

Codeforces Round #321 (Div. 2) C. Kefa and Park(树+dfs)

时间:2022-10-05 21:00:45浏览次数:92  
标签:idx LL Park Codeforces dfs flag 餐馆 节点

https://codeforces.com/contest/580/problem/C

题目大意:
给定一棵树,这棵树总共有n个节点,自己家住在节点1(根节点);

每个节点都有一个标记a[i],标记为1就是这个地方有猫,0就表示没有;

每个叶子节点都是餐馆,我们想去最多数量的餐馆,但是我们不想走这条数量有连续>m个猫的路去餐馆。

问我们这样的餐馆数量有多少?
input 
4 1
1 1 0 0
1 2
1 3
1 4
output 
2
input 
7 1
1 0 1 1 0 0 0
1 2
1 3
2 4
2 5
3 6
3 7
output 
2

需要注意的点

  • 无向边:所以我们需要两端都建立边
  • 特判父节点:否则导致死循环;
  • 叶子节点只有它自己,根节点也有可能只有它自己,所以我们在判断叶子节点时,需要把根节点拉出来特判
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=200200,M=2002;
LL n,m,a[N],ans=0;
vector<LL> g[N];
void dfs(LL idx,LL fa,LL sum,LL flag)
{
    if(sum>m) flag=1;//记得题目是要严格大于哦
    if(idx!=1&&g[idx].size()==1)//叶子节点,判断是否有误
    {
        if(flag==0) ans++;
        return ;
    }
    for(LL i=0;i<g[idx].size();i++)
    {
        if(g[idx][i]==fa) ;//判断父节点
        else
        {
            if(a[g[idx][i]]==0) dfs(g[idx][i],idx,0,flag);//当前数量标记可以重新填写
            else dfs(g[idx][i],idx,sum+1,flag);//当前数量继续递增
        }
    }
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        for(LL i=1;i<n;i++)
        {
            LL v,w;
            cin>>v>>w;
            g[v].push_back(w);
            g[w].push_back(v);
        }
        dfs(1,-1,a[1],0);//从根节点开始,父节点为-1,数量为a[1],标记一下有没有产生过
        cout<<ans<<endl;
    }
    return 0;
}

嘻嘻,写出来了这题我好开心哇!

标签:idx,LL,Park,Codeforces,dfs,flag,餐馆,节点
From: https://www.cnblogs.com/Vivian-0918/p/16756362.html

相关文章

  • *洛谷 P1018 [NOIP2000 提高组] 乘积最大(dfs+高精度)
    说在前头此篇题解是记录自己的暴力写法,并不能100分满分通过洛谷测试数据(只有60)纯纯记录写法而写https://www.luogu.com.cn/problem/P1018我还说这么简单呢这题,想太......
  • Codeforces 1660 D
    我是蒟蒻!我是蒟蒻!我是蒟蒻!重要的事情说三遍!传送门传送门点这儿!$\color{white}{哈哈哈!你被骗了!}$$\color{white}{真传送门在上面的感叹号!}$思路嗯?一片空白?最......
  • ABC 249 C - Just K(dfs)
    https://atcoder.jp/contests/abc249/tasks/abc249_c题目大意:给定n个字符串,让我们随意选择,然后找到这里面相同的字母刚好等于k个的时候的数量是多少?求可选择出来的最......
  • HDFS shell命令行常用操作
    1.hadoopfs-mkdir[-p]<path>path为待创建的目录,如果没有一个父目录就加一个-p例:hadoopfs-mkdir/yuan创建一个shenzi的目录2.hadoopfs-ls[-h][-R][path]p......
  • SparkCore:累加器和广播变量
    累加器累加器(分布式共享只写变量):用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个Task都会得到这个变量的一份新的副本,每......
  • Codeforces Round #804 (Div. 2) C(组合 + mex)
    CodeforcesRound#804(Div.2)C(组合+mex)本萌新的第一篇题解qwq题目链接:传送门QAQ题意:给定一个\(\left[0,n-1\right]\)的排列,问有多少个排列,所有的子区间的......
  • Codeforces Round #824 (Div. 2)
    题目链接A~D懒得写。不是因为题不好,其实我觉得做起来非常舒适。但就是懒得写了(E-HousePlanning\(d_1,d_2\)全打乱感觉很难。先看看不打乱怎么做。对于每个\(i......
  • Codeforces Round #774 (Div. 2) - E. Power Board
    枚举+数论Problem-E-Codeforces题意有一个\(n*m\;(1<=n,m<=10^6)\)的矩阵,第i行第j列是\(i^j\),求这个矩阵中的\(n*m\)的数中有多少种不同的数思路......
  • Codeforces Round #785 (Div. 2) - D. Lost Arithmetic Progression
    GCDProblem-D-Codeforces题意有2个等差数列A,B,它们公有的项组成新的等差数列C;现在给出B的(首项,公差,项数)=(b,q,y),C的(首项,公差,项数)=(c,r,z)求满足条件的A的数量,如......
  • 02-分布式文件服务器FastDFS[简介, 架构详解]
    分布式文件服务器-FastDFS什么是FastDFSFastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了......