#include<iostream>
#include<vector>
using namespace std;
class CA
{
public:
enum{N=100};
void run();
void findroot();
void count(int father);
void print();
private:
int n,m;
int tree[N][N];
int level;
int root;
int mark[N];
int leafnum[N];
};
void CA::run()
{
cin>>n>>m;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
tree[i][j]=0;
int a,b,c;
for(i=0;i<m;i++)
{
cin>>a>>b;
for(j=0;j<b;j++)
{
cin>>c;
tree[a-1][c-1]=c;
}
}
findroot();
for(i=0;i<n;i++)
leafnum[i]=0;
count(root);
print();
}
void CA::findroot()
{
int i;
for(i=0;i<n;i++)
mark[i]=0;
int j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(tree[i][j]!=0)
mark[(tree[i][j]-1)]=-1;
root=0;
for(i=0;i<n;i++)
if(mark[i]==0)
root=i+1;
level=0;
}
void CA::count(int father)
{
int i,k;
k=0;
for(i=0;i<n;i++)
if(tree[father-1][i]!=0)
{
k=1;
mark[i]=mark[father-1]+1;
count(i+1);
if(mark[i]>level)
level=mark[i];
}
if(k==0)
{
leafnum[mark[father-1]]++;
}
}
void CA::print()
{
//printf("%d\n",root);
int i;
printf("%d",leafnum[0]);
for(i=1;i<=level;i++)
printf(" %d",leafnum[i]);
}
int main()
{
CA *a=new CA;
a->run();
return 0;
}
自己写的正确,但是参考的同样巧妙