题目地址:https://www.patest.cn/contests/pat-a-practise/1004
C语言实在有点麻烦
/*
Member(Vertex):表示一个家庭成员,我使用了两个结构成员:
level,表示这个人在家谱中的辈分,最高的辈分是0,辈分越低,level越大
child,指向Child结构变量,即链表的第一个节点
Child(Edge):表示亲子关系,也使用了两个结构成员:
ID,表示这个孩子的ID
iter,指向相同父母的下一个孩子Child变量
*/
#include
#define MAX 999
typedef struct Member *Member;
typedef struct Child *Child;
struct Member{
int level;
Child child;
};
struct Child{
int ID;
Child iter;
};
main()
{
int i,k,N, M, ID, cID, K,level;
struct Member nodes[100]; //定义一个Member变量
struct Child children[100];
//定义一个Child变量,这里指针变量不需要加*是因为前面已经定义了别名,*child就是child
/* 读取数据,初始化邻接链表 */
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++)
{
nodes[i].level = MAX;
nodes[i].child = NULL;
}
nodes[1].level = 0; /* 根节点为0 */
for(i = 0,k=0; i < M; i++) //这么写是k只赋了一次值,k可以一直增长,若赋在第二层,则会重复赋值。
{ //i
iter)
nodes[c->ID].level+=i;
}
/*对于每一层,找到叶子结点 */
int n = N, count;
for(level = 0; n; level++)
{
count = 0;
for(i = 1; i <= N; i++)
if(nodes[i].level == level)//每层遍历
{
n--;
if(nodes[i].child == NULL)
count++;
/* set the children to next level */
Child c;
for(c = nodes[i].child; c; c = c->iter)//其实就是一个赋值,他下一层所有的孩子赋为level+1
nodes[c->ID].level = level + 1; //一次性他的孩子全赋了
}
printf("%d%c", count, n ? ' ' : '\0');//这句相当不错啊,n没了就输出NULL
}
}
粘一段C++的代码(DFS)
#include
#include
#include
#include
using namespace std;
const int maxn=1e2+10;
int n,m,k,x,f[maxn],deep,y;
vector
t[maxn]; void dfs(int x,int dep) { deep=max(deep,dep); if (!t[x].size()) f[dep]++; for (int i=0;i