题意:没有儿子的节点所结苹果数是节点的编号,有儿子的所结苹果是儿子数量(k+1)/2个,求跟节点的苹果数
直接递归一下,先求出所有儿子的苹果树,在排序,,刚开始以为1就是根节点,根节点不确定,,
#include<stdio.h> #include<string.h> #include<stdlib.h> const int N=20010; int w[N],vis[N],head[N],num,p[N]; struct edge { int st,ed,next; }e[N*4]; int cmp(void const *a,void const *b) { return *(int *)a-*(int *)b; } void addedge(int x,int y) { e[num].st=x;e[num].ed=y;e[num].next=head[x];head[x]=num++; } int dfs(int u) { w[u]=u; int i,j=0; for(i=head[u];i!=-1;i=e[i].next) dfs(e[i].ed); for(i=head[u];i!=-1;i=e[i].next) p[j++]=w[e[i].ed]; if(j>0) { qsort(p,j,sizeof(p[0]),cmp); w[u]=p[(j+1)/2-1]; } return w[u]; } int main() { int i,x,n,m; while(scanf("%d",&n)!=-1) { memset(head,-1,sizeof(head)); num=0; memset(w,0,sizeof(w)); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { scanf("%d",&m); while(m--) { scanf("%d",&x); addedge(i,x); vis[x]=1; } } for(i=1;i<=n;i++) { if(vis[i]==0) printf("%d ",dfs(i)); } } return 0; }