hdu 3290 (简单dfs)

来源:互联网 发布:java poi 自动列宽 编辑:程序博客网 时间:2024/06/05 20:57

题意:没有儿子的节点所结苹果数是节点的编号,有儿子的所结苹果是儿子数量(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\n",dfs(i));}}return 0;}






原创粉丝点击