(dfs)C. Kefa and Park

传送门:https://vjudge.net/problem/246619/origin

  • 题意: 主人公要到公园去玩,这个公园是一个有根树,主人公起点在点1处,其叶子节点是餐厅所在地,其中红色标记的点都是a【i】==1的点,同时表示这个点有猫.主人公害怕猫,不希望经过连续m个点都有猫的路径,问主人公可以到达哪几个餐厅。
  • 题解: dfs,注意标记以及邻接表的使用
    代码:
#include <iostream>
#include<cstdlib>
#include<stdio.h>
#include<algorithm>
#include<set>
#include<vector>
#include<assert.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef long long ll;
const ll mod = 1000000007;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

const int maxn = 1e5+5;
vector<int>G[maxn];
int a[maxn];
bool vis[maxn];
int out,m,n;

void init(){
    rep(i,1,n) G[i].clear();
    memset(vis,0,sizeof(vis));
    out = 0;
}

void dfs(int u,int cat){
    vis[u] = 1;
    if(cat>m)return ;
    int flag = 0;
    rep(i,0,G[u].size()-1){
        int v = G[u][i];
        if(!vis[v]){
            flag = 1;
            if(a[v]) dfs(v,cat+1);
            else dfs(v,0);
        }
    }
    if(flag==0) out++;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        rep(i,1,n) scanf("%d", &a[i]);
        rep(i,1,n-1){
            int u,v;
            scanf("%d%d", &u,&v);
            G[u].pb(v);
            G[v].pb(u);
        }
        dfs(1,a[1]);
        printf("%d",out);
    }
    return 0;
}
    原文作者:laochonger
    原文地址: https://www.jianshu.com/p/8dbc5835531f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞