Equilibrium Mobile (UVa 12166) dfs二叉树

题目:

思路: 方法很巧妙,参考的网上的方法。 任意一点都可以决定整棵树(根结点)的重量,设这个结点重量为 w ,位于第 depth 层,则整棵树的重量为 w<<depth。因此只要统计所有点对应的整棵树的重量所出现的次数,再用点的数量减去重量出现最多的次数即为答案。

/* Equilibrium Mobile (UVa 12166) */
#include <iostream>
#include <cstring>
#include <map>
using namespace std;

const int maxn = 1 << 20;

map<long long, int> cnt;
int sum;
char s[maxn];

void solve(int begin, int end, int depth);        // dfs 求出每个结点对应的整棵树的重量,并统计

int main(){
    //freopen("input.txt", "r", stdin);
    int T;
    cin >> T;    getchar();
    while(T--){
        cin >> s;
        cnt.clear();
        sum = 0;
        solve(0, strlen(s)-1, 0);
        
        int num = 0;
        for(map<long long, int>::iterator it = cnt.begin(); it != cnt.end(); it++){    //求出每个重量对应的个数的最大值 
            num = max(num, it->second);
        }
        
        cout << sum - num << endl;        //一共有 sum 个点,减去 num 就是要修改的个数 
    }
} 

void solve(int begin, int end, int depth){
    if(s[begin] == '['){
        int  t = 0;
        for(int i=begin+1; ; i++){
            if(s[i] == '[')    t++;
            if(s[i] == ']') t--;
            if(t==0 && s[i] == ','){
                solve(begin+1, i-1, depth+1);
                solve(i+1, end-1, depth+1);
                break;
            }
        }
    }else{
        long long num = 0;
        for(int i=begin; i<=end; i++){
            num = num*10 + s[i] - '0';
        }
        cnt[num << depth]++;
        sum++;
    }
}

 

posted @ 2016-11-09 19:59  淡蓝色光  阅读(178)  评论(0编辑  收藏  举报