给出一颗二叉树,用红绿蓝进行染色,要求二叉树三角形的颜色不同,求绿色节点的数目的最大最小值。
给出树的方法比较特殊,因此直接递归即可,无须建图。
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 }