这题的时间其实没必要10000ms,o(n)的复杂度就行了,算是dp吧,每次从叶节点往上更新就是,附上代码
#include<stdio.h>
#include<string.h>
int lcy[1510],fa[1510],son[1510],ans,len;//lcy是叶节点数组,实时更新,fa是父亲节点,son表示儿子节点的个数,ans就是要占领的点的个数,len是lcy数组的长度
bool flag[1510];
void calcu(int s)
{
if(s==-1||fa[s]==-1)return;
if(flag[s])
{
s=fa[s];
son[s]--;
if(!son[s])
lcy[len++]=s;//更新叶子节点
}
else
{
s=fa[s];
son[s]--;
if(!flag[s])//儿子和父亲都没被标记,标记父亲节点
{
ans++;
flag[s]=1;
}
if(!son[s])
lcy[len++]=s;//更新叶子节点
}
}
int main()
{
int i,j,n,num,a;
while(scanf("%d",&n)!=-1)
{
memset(flag,0,sizeof(flag));
memset(fa,-1,sizeof(fa));
int node;
len=0;
for(i=0;i<n;i++)
{
scanf("%d:(%d)",&node,&num);
son[node]=num;//保存叶子节点
if(num==0)
{
lcy[len++]=node;
continue;
}
while(num--)
{
scanf("%d",&a);
fa[a]=node;
}
}
//for(i=0;i<len;i++)
//printf("lcy[%d]=%d\n",i,lcy[i]);
ans=0;
for(i=0;;i++)
{
if(i==len)break;
calcu(lcy[i]);
}
printf("%d\n",ans);
}
return 0;
}