BZOJ1864 [ZJOI2006] 三色二叉树

给出一颗二叉树,用红绿蓝进行染色,要求二叉树三角形的颜色不同,求绿色节点的数目的最大最小值。

给出树的方法比较特殊,因此直接递归即可,无须建图。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 char str[1000005];
 5 int pin;
 6 
 7 int sw(int a,int b,int c){
 8     if(c) return max(a,b);
 9     else return min(a,b);
10 }
11 
12 pair<int,int> dfs(int k){
13     pin++;
14     if(str[pin-1]=='0') return make_pair(1,0);
15     if(str[pin-1]=='1'){
16         pair<int,int> nxt = dfs(k);
17         return make_pair(nxt.second+1, sw(nxt.first,nxt.second,k));
18     }
19     if(str[pin-1]=='2'){
20         pair<int,int> cl = dfs(k);
21         pair<int,int> cr = dfs(k);
22         return make_pair(cl.second+cr.second+1, sw(cl.first+cr.second, cl.second+cr.first,k));
23     }
24 }                
25 
26 int main(){
27     scanf("%s",&str);
28     pair<int,int> result=dfs(1);
29     printf("%d ",max(result.first, result.second));
30     pin=0; result=dfs(0);
31     printf("%d\n",min(result.first, result.second));
32 }

 

转载于:https://www.cnblogs.com/mollnn/p/8284302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值