把上一题代码稍微改了一下。
#include <stdio.h>
#include <stdlib.h>
typedef struct EdgeNode {
int ID;
struct EdgeNode* next;
}EdgeNode, *PEdgeNode;
typedef struct VNode {
int UserID;
PEdgeNode FirstChild;
}VNode;
typedef int Position;
struct QNode {
int *Data; /* 存储元素的数组 */
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
};
typedef struct QNode *Queue;
int CntLargest(VNode Family[],int *Level);
void EnQueue(Queue Q, int X);
int DeQueue(Queue Q);
int IsEmpty(Queue Q);
Queue CreateQueue(int MaxSize);
int main()
{
VNode Family[100];
int N, M, i, ChildN, Parent, Largest, Child,level=1;
scanf("%d %d", &N, &M);
for (i = 0; i < N; i++) {
Family[i].UserID = i + 1;
Family[i].FirstChild = NULL;
}
for (i = 0; i < M; i++) {
scanf("%d %d",&Parent, &ChildN);
while (ChildN--) {
PEdgeNode PChild = (PEdgeNode)malloc(sizeof(EdgeNode));
scanf("%d", &Child);
PChild->ID = Child;
PChild->next = Family[Parent - 1].FirstChild;
Family[Parent - 1].FirstChild = PChild;
}
}
//for (PEdgeNode w = Weibo[4 - 1].FirstForward; w; w = w->next)
//printf("*%d*", w->UserID);
Largest = CntLargest(Family,&level);
printf("%d %d\n", Largest,level);
return 0;
}
int CntLargest(VNode Family[],int *Level)
{
int cnt = 1, v, last = 1, first = 0,Largest=1,level=1;
Queue Q = CreateQueue(100);
PEdgeNode w;
EnQueue(Q, 1);
while (!IsEmpty(Q)) {
v = DeQueue(Q);
first++;
for (w =Family[v - 1].FirstChild; w; w = w->next) {
EnQueue(Q, w->ID);
cnt++;
}
if (first == last) {
level++;
if (cnt - last > Largest) {
Largest = cnt - last;
*Level = level;
}
last = cnt;
}
}
free(Q);
return Largest;
}
Queue CreateQueue(int MaxSize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (int *)malloc(MaxSize* sizeof(int));
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
return Q;
}
void EnQueue(Queue Q, int X)
{
Q->Rear = (Q->Rear + 1) % Q->MaxSize;
Q->Data[Q->Rear] = X;
}
int IsEmpty(Queue Q)
{
return (Q->Front == Q->Rear);
}
int DeQueue(Queue Q)
{
Q->Front = (Q->Front + 1) % Q->MaxSize;
return Q->Data[Q->Front];
}