zoukankan      html  css  js  c++  java
  • 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++;
        }
    }
  • 相关阅读:
    用户及文件权限管理
    Linux基础操作及概念
    监督学习和非监督学习
    基于仿生算法的智能系统I
    9.Dijkstra求最短路 II 堆优化的Dijkstra
    8.Dijkstra求最短路 I 朴素Dijkstra
    7.有向图的拓扑序列 拓扑排序
    6.树与图的广度优先遍历 图中点的层次
    5.树的重心 树与图的深度优先遍历
    4.八数码 BFS
  • 原文地址:https://www.cnblogs.com/lighter-blog/p/6048264.html
Copyright © 2011-2022 走看看