hdu 3290 (简单dfs)

题意:没有儿子的节点所结苹果数是节点的编号,有儿子的所结苹果是儿子数量(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;

}


 





 

你可能感兴趣的:(HDU)