您的位置:首页 > 其它

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

2015-09-24 19:44 615 查看
题目链接:点击打开链接

第一行给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: