poj1694 排序+DFS

/**
 * poj1694
 * 深搜+排序
 * 以深搜的方式计算每一点所需的点数,计算的方法是
 * 如果该点为叶子,返回1
 * 否则,将其子点以子点的子点个数排序
 * 从子点最多的子点开始模拟,根据需要的点和剩余的点,直到模拟出该点所需要的点的个数
 * 最后返回root所需点的个数即可
 */

#include <iostream>
#include <stdlib.h>
using namespace std;

int tree[201][201];
int child_num[201];
int status[201];

int cmp ( const void *a , const void *b ) 
{ 
    return *(int *)b - *(int *)a; 
} 

int dfs(const int idx){

    const int num = child_num[idx];

    if(num == 0) return 1;
    int needed[num+1];
    //计算各child的need值
    for(int i=1;i<=num;++i){
        needed[i] = dfs(tree[idx][i]);
    }
    //对所有need值排序
    qsort(needed+1,num,sizeof(needed[0]),cmp); 
/*
    cout << idx << "th sorted: ";
    for(int i=1;i<=num;++i){
        cout << " " << needed[i];
    }
    cout << endl;
*/
    //计算到达本点的needed值,返回
    int need = 0,left = 0;
    for(int i=1;i<=num;++i){
        if(left<needed[i]){
            need += needed[i] - left;
            left = needed[i] - 1;
        }

        else{
            left -= 1;
        }
    }

    //cout << "idx: " << idx << " need " << need << endl;
    return need;
}

int main(){
    int m;

    cin >> m;
    while(m--){
        int leaf_num;
        cin >> leaf_num;
        for(int i=1;i<=leaf_num;++i){
            int leaf_idx;
            cin >> leaf_idx;
            cin >> child_num[leaf_idx];
            for(int j=1;j<=child_num[leaf_idx];++j){
                cin >> tree[leaf_idx][j];
            }

        }

        int needed = 0,left = 0;

/*
        for(int i=1;i<=leaf_num;++i){
            for(int j=1;j<=child_num[i];++j){
                cout << tree[i][j] << " ";
            }
            cout << endl;
        }
*/
        needed = dfs(1);
        cout << needed << endl;
    }    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值