/*
POJ1694 An Old Stone Game
仍未透彻理解其算法思想啊啊啊啊
题意:有一棵古老的树,树有各种叉,目标是在树根上放一个石头。
有k个石头在桶里面,每次将一个石头放到树叶上,对于每个节点,
只有子树上面所有的节点都放满了石头,才能在节点上放一个,
然后将子树上面的石头去掉,直到在根上放了石头,让求用最少的石子达到终点条件
思路:根的石头数是1,根的节点有n1,n2……nn的话,
那么就要先求节点需要的最少石子数,节点按照降序排列,
然后递归求解
DFS、贪心,但是还是理解的不透彻,心痛,毕竟不是自己想出来的啊
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>//qsort
using namespace std;
int Node[210][210];
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
int Tree(int n)
{
int maxn,i;
int sum[210];
if(Node[n][0]==0)
return 1;
for(i=1;i<=Node[n][0];i++)
sum[i-1]=Tree(Node[n][i]);
qsort(sum,Node[n][0],sizeof(int),cmp);//降序
maxn=-1;
for(i=0;i<Node[n][0];i++)
if(sum[i]+i>maxn)
maxn=sum[i]+i;
return maxn;
}
int main()
{
int m,n,t;
cin>>m;
while(m--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t,&Node[i][0]);//根树的节点和子节点的个数
for(int j=1;j<=Node[i][0];j++)
{
scanf("%d",&Node[i][j]);
}
}
cout<<Tree(1)<<endl;
}
return 0;
}
这个题目要回来再写一遍啊
POJ1694 An Old Stone Game
最新推荐文章于 2016-10-27 21:35:39 发布