六度空间理论
描述
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入
多组数据,每组数据m+1行。第一行有两个数字n和m,代表有n个人和m组朋友关系。n个人的编号为1到n。第二行到第m+1行每行包括两个数字a和b,代表这两个人互相认识。当n和m都等于0时,输入结束。
输出
每组数据输出n行,对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
样例输入1
10 9 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 9 10 0 0
样例输出1
1: 70.00% 2: 80.00% 3: 90.00% 4: 100.00% 5: 100.00% 6: 100.00% 7: 100.00% 8: 90.00% 9: 80.00% 10: 70.00% 1: 70.00% 2: 80.00% 3: 80.00% 4: 80.00% 5: 80.00% 6: 80.00% 7: 80.00% 8: 70.00% 9: 20.00% 10: 20.00%
解答:根据输入,用邻接表表示法创建无向图。以每一个顶点为起点,广度优先搜索遍历邻接表的6层结点,统计访问结点的个数。
#include<stdio.h>
#include<stdlib.h>
#define maxn 100
typedef struct node
{
int data;
struct node *next;
} Node;
Node *V[maxn];
int visit[maxn];
void BFS(int s,int n)
{
int count=1;
Node *p;
for(int i=1; i<=n; i++)
visit[i]=0;
int Queue[maxn];
int front=0,rear=0,last=0;
Queue[0]=s;
visit[s]=1;
int js=0;
while(front<=last)
{
p=V[Queue[front++]]->next;
while(p)
{
if(!visit[p->data])
{
count++;
visit[p->data]=1;
Queue[++rear]=p->data;
}
p=p->next;
}
if(front>last)
{
last=rear;
js++;
if(js==6)
break;
}
}
printf("%d: %.2f%%\n",s,count*100.0/n);
}
int main()
{
int n,m;
int x,y;
Node *p;
while(1)
{
scanf("%d %d",&n,&m);
if(n==0 && m==0)
break;
for(int i=1; i<=n; i++)
{
V[i]=(Node *)malloc(sizeof(Node));
V[i]->data=i;
V[i]->next=NULL;
}
while(m--)
{
scanf("%d %d",&x,&y);
p=(Node *)malloc(sizeof(Node));
p->data=y;
p->next=V[x]->next;
V[x]->next=p;
p=(Node *)malloc(sizeof(Node));
p->data=x;
p->next=V[y]->next;
V[y]->next=p;
}
for(int i=1; i<=n; i++)
BFS(i,n);
}
return 0;
}