解题思路:开始我想着用邻接表来存储图,但是发现邻接表只能遍历顶点的出度点,而题目的意思是出入度点都得包含。所以我采用邻接矩阵存储图,开始开了一个G[N+1][N+1]的全局变量数组,运行后超出内存,后来改用动态数组运行成功。
参考文章:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 10000
int BFS(int i,int N,int **G)
{
int q[MAXN+1],visit[MAXN+1],front,rear,count,level,last,tail,v,j;
memset(visit,0,sizeof(visit));
visit[i]=1;
front=rear=-1;
count=1;//计算六度空间的个数
level=0;//level计算层数,等于6时跳出
last=i;//last为上一层最后的顶点
q[++rear]=i;
while(front<rear)
{
v=q[++front];
for(j=1;j<=N;j++)
if(!visit[j]&&G[v][j]==1)
{
q[++rear]=j;
visit[j]=1;
count++;
tail=j;//tail是当前层的最后一个顶点
}
if(v==last)
{
level++;
last=tail;
}
if(6==level)
{
return count;
break;
}
}
return count;
}
int main()
{
int N,E,i,x,y,counter;
int **G;
scanf("%d %d",&N,&E);
G=(int**)malloc((N+1)*sizeof(int*));
for(i=0;i<=N;i++)
G[i]=(int*)malloc((N+1)*sizeof(int));
for(i=0;i<E;i++)
{
scanf("%d %d",&x,&y);
G[x][y]=G[y][x]=1;
}
for(i=1;i<=N;i++)
{
counter=BFS(i,N,G);
printf("%d: %.2f%%\n",i,(float)counter/N*100);
}
free(G);
}