用邻接表存储图,然后BFS
70~78这几行的代码必须放在while(rear!=front)这个循环的尾端,防止最大代位于末端时而由于front=rear已成立而跳出循环从而没有更新
#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct ArcNode{
struct ArcNode *next;
int adjvex;
}arcnode;
typedef struct VNode{
arcnode *firstarc;
}vnode;
typedef struct GraphNode{
int n,e;
vnode adjlist[max];
}AGraph;
void BFS(int x,AGraph *G,int *level,int*Max);
int main() {
int N,M;
int parent,count,child;
int level=1,Max=1;
scanf("%d %d",&N,&M);
AGraph *G=(AGraph*)malloc(sizeof(AGraph));
G->n=0;
for(int i=1;i<=N;i++)
G->adjlist[i].firstarc=NULL;
for(int i=0;i<M;i++){
scanf("%d %d",&parent,&count);
for(int j=0;j<count;j++){
scanf("%d",&child);
arcnode *s=(arcnode*)malloc(sizeof(arcnode));
s->adjvex=child;
s->next=G->adjlist[parent].firstarc;
G->adjlist[parent].firstarc=s;
}
}
BFS(1,G,&level,&Max);
printf("%d %d",Max,level);
free(G);
return 0;
}
void BFS(int x,AGraph *G,int *level,int*Max){
arcnode *p;
int queue[max],rear,front,visited[max]={0},q,current_num=0,Level=1;
int level_num=1,next_num=0;
rear=front=0;
queue[rear]=x;
rear=(rear+1)%max;
visited[x]=1;
while(rear!=front){
q=queue[front];
front=(front+1)%max;
current_num++;
p=G->adjlist[q].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==0){
next_num++;
visited[p->adjvex]=1;
queue[rear]=p->adjvex;
rear=(rear+1)%max;
}
p=p->next;
}
if(current_num==level_num){
if(level_num>*Max){
*Max=level_num;
(*level)=Level;
}
level_num=next_num;
next_num=current_num=0;
Level++;
}
}
}