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

本文介绍了一个基于图遍历算法的问题解决方法。在一个包含n个节点的图中,每个节点可能带有猫猫标记(1表示有猫猫,0表示没有)。从编号为1的节点出发,目标是计算可以达到的叶子节点数量,但要求路径上连续带有猫猫标记的节点数量不能超过m个。通过深度优先搜索(DFS)策略,并结合特定的数据结构进行优化,实现了这一挑战的有效解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接


第一行给你n、m,接下来的一行有n个数,如果为1则代表这个点有cat,接下来的n-1行每行给出x、y,表示x、y相连。问你从1出发

能到达的叶子结点有几个,要求到达叶子结点的路上连续有cat的点不超过m。


a数组保存结点是否含有cat,从1这个点开始dfs,每次dfs对cat数组操作,记录连续的含有cat的点数,回溯时再判断当前结点是否满足

条件,要求结点为叶子结点且连续cat数不超过m且不是根结点。


AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "vector"
using namespace std;
const int MAXN = 1e5 + 5;
int n, m, ans, a[MAXN], cat[MAXN];
bool vis[MAXN];
vector<int> v[MAXN];
void dfs(int x)
{
	for(int i = 0; i < v[x].size(); ++i)
		if(!vis[v[x][i]]) {
			vis[v[x][i]] = true;
			cat[v[x][i]] = (cat[x] + 1) * a[v[x][i]];
			if(cat[v[x][i]] > m) continue;
			dfs(v[x][i]);
		}
	if(v[x].size() == 1 && x != 1 && cat[x] <= m) ans++;
}
int main(int argc, char const *argv[])
{
	cin >> n >> m;
	for(int i = 1; i <= n; ++i)
		cin >> a[i];
	for(int i = 0; i < n - 1; ++i) {
		int x, y;
		cin >> x >> y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	vis[1] = true;
	cat[1] = a[1];
	dfs(1);
	cout << ans << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值