首页 > 其他分享 >题解 CF1676G

题解 CF1676G

时间:2022-11-30 09:36:45浏览次数:71  
标签:co int 题解 dfs CF1676G include 节点

这个题标签里有树形 dp ,但是其实用dfs已经足以解决这道题。

看这道题就可以发现这两道题其实是差不多的。

首先需要给两个节点之间建边,我们需要从 2n 循环输入。

因为他输入的是当前 2~n 的节点的父亲。

然后,我们将颜色读进来之后,把白色记为 1 ,黑色记为 -1

这样计算的时候只要判断黑色的和白色的相加是否为 0 即可。

接着进行 dfs ,这里的 dfs 需要进入两个形参,

一个是当前节点的编号,一个是当前节点的父亲。

我们在里面循环找儿子的时候要保证不能往回走,所以要判断一下。

最终把节点的颜色和加起来,然后判断是否为0即可。

一定要记得初始化,因为 vector 用的是二维,所以要循环 clear

尽管不能真实的清除空间,但是我们这个题不需要清除空间。

只需要保证将所有的边都清除即可。

#include<cstdio>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
const int N=4e3+10;
int T,n,ans;
vector<int> v[N];
int a[N],co[N],b[N];
void dfs(int x,int f){
	b[x]=co[x];
	for(int i=0;i<v[x].size();i++){
		if(v[x][i]!=x && v[x][i]!=f){
			dfs(v[x][i],x);
			b[x]+=b[v[x][i]];
		}
	}
	if(!b[x]){
		ans++;
	}
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		ans=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(int i=1;i<=n;i++){
			v[i].clear();
		}
		for(int i=2;i<=n;i++){
			scanf("%d",&a[i]);
			v[a[i]].push_back(i);
			v[i].push_back(a[i]);
		}
		for(int i=1;i<=n;i++){
			char c;
			cin>>c;
			if(c=='W'){
				co[i]=1;
			}else{
				co[i]=-1;
			}
		}
		dfs(1,0);
		printf("%d\n",ans);
	}
	return 0;
}

标签:co,int,题解,dfs,CF1676G,include,节点
From: https://www.cnblogs.com/Tyrue-blog/p/16937428.html

相关文章

  • 题解 SP346
    题解SP346这个题的翻译貌似有点问题,这里的coins和goldcoins其实是一个东西有了这个前提,我们是再去看题面,就可以发现,这里的coins可以同时换成$\dfrac{n}{2}\\df......
  • 题解 CF1743B
    这个题是个简单的构造题因为不能有连续的“排列”,而排列序列都是必须是以\(1\)开头所以我们只要让\(2\)和\(1\)不相邻就能保证一个序列里只有它本身和\(1\)这两......
  • 题解 CF1370B
    题解CF1370B这个题跟脑筋急转弯一样诶\(gcd\)这个东西他有很多种可能性,但是如果我们考虑最简单的数字性质奇偶,就会发现,其实所有偶数的\(gcd\)都是\(2\)对吧所以,我......
  • 题解 CF471A
    题解CF471A这个题看题解都写得非常的冗余,不简洁,这里提供一种特别神奇的做法首先他需要我们判断这里是否有相同的数字,并且还要通过这个相同的个数来进行判断所以,我们可......
  • 题解 CF1719B
    题解CF1719B这个题观察样例,可以发现,被选中的两个数,一定是相邻的两个数。所以,我们只需要先循环一遍,看看有多少数满足,然后判断是否等于n。如果等于说明可以,先输出YES......
  • 题解 SP18965
    题解SP18965题目大意:奶牛很厌烦等待,奶牛i在它的截止时间$d_i(1\leqd_i\leq10,000)$前挤\(g(1\leqg_i\leq1000)\)的奶,否则将不能挤奶。时间t开始时为0,......
  • 题解 CF518B
    题解CF518B这个题最暴力的做法就是对于每个\(s_i\)都在b字符串里扫一遍但是\(s.len\leq2\times10^5\)所以肯定过不了但是我们思考一下,这里的字母对应其实可以......
  • 题解 CF1719A
    题解CF1719A这个题判断\(n+m\)的奇偶性就可以了。奇数输出Burenka,偶数输出Tonya。#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>......
  • 题解 CF1716B
    题解CF1716B这是一个纯纯的构造题我们要构造n个序列,每个序列他的元素\(a_i\)在第i个位置上的数量都应该比上一个序列的数量并且这种序列只能通过交换两个数字来......
  • 题解 CF1091C
    题解CF1091C这个题乍一看,好像有点像约瑟夫问题,但是写完了之后会发现,就会发现TLE了因为\(n\le10^9\),而且用约瑟夫问题写的话每次都会跳k步,肯定会超时超时代码这里......