題意:給定n個點的數 常數m
下面n個數給出點權(點權爲0或1)
要求從根走到葉子節點的最短路徑上 連續1的個數不超過m個 的葉子節點有多少個
思路:dfs搜一遍
代碼如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
int n, m, e, ans, cnt, tmp;
int a[N], head[2*N];
struct node
{
int v, nex;
}edge[2*N];
void init()
{
e = 0;
memset(head, -1, sizeof(head));
}
void add(int u, int v)
{
edge[e].v = v;
edge[e].nex = head[u];
head[u] = e++;
}
void dfs(int u, int fa, int k)
{
if(a[u]) k++;
else k = 0;
if(k > m) return;
bool flag = true;
for(int i = head[u]; ~i; i = edge[i].nex)
{
int v = edge[i].v;
if(v == fa)continue;
flag = false;
dfs(v, u, k);
}
if(flag) ++ans;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
init();
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for(int i = 1, u, v; i < n; i++)
{
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
ans = 0;
dfs(1, -1, 0);
printf("%d\n", ans);
}
return 0;
}