“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/35f37373dc62dccfc445c5f63fa7acaf.png)
图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤104,表示人数)、边数M(≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。
输出格式:
对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
输入样例:
10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
输出样例:
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%
#include<stdlib.h>
typedef struct v {
int n;
struct v* next;
}V,*qV;
typedef struct node {
int data;
int C;
}Node;
typedef struct stack
{
Node *a;
int top;
int end;
}Stack,*qStack;
//建队
void CreateStack(qStack *q,int number) {
*q = (qStack )malloc(sizeof(Stack));
(*q)->a = (Node *)malloc(sizeof(Node)*number);
(*q)->top = 0;
(*q)->end = 0;
}
//出队
Node Pop(qStack *q) {
Node s;
s.C = 0;
s.data = 0;
(*q)->top++;
s.C = (*q)->a[(*q)->top].C;
s.data = (*q)->a[(*q)->top].data;
return s;
}
//入队
void Push(qStack *q, Node n) {
(*q)->end++;
(*q)->a[(*q)->end] = n;
}
//创建邻接表
qV* Create(qV *q,int number) {
q = (qV *)malloc(sizeof(qV)*number);
for (int i = 1; i < number; i++) {
qV s = (qV)malloc(sizeof(V));
s->n = i;
s->next = NULL;
q[i] = s;
}
return q;
}
//插入邻接表
void Insert(qV **q,int a,int b) {
qV s = (qV)malloc(sizeof(V));
s->n = b;
s->next = (*q)[a]->next;
(*q)[a]->next = s;
}
//遍历六层
void LookAll(qV *q,qStack *stack,int number,int *m,int i) {
float ss = 0;
qV s;
Node N;
N.C = 0;
N.data = i;
m[i] = 1;
Push(stack, N);
while ((*stack)->top!= (*stack)->end)
{
Node w = Pop(stack);
s = q[w.data];
while (s->next != NULL)
{
s = s->next;
if (m[s->n]!=1) {
m[s->n] = 1;
Node N;
N.data = s->n;
N.C = w.C + 1;
if (N.C <= 6) {
ss++;
Push(stack, N);
}
}
}
}
printf("%d: %.2f%%\n",i,((ss+1)/number)*100);
for (int i = 0; i <= number; i++)
{
m[i] = 0;
}
}
int main()
{
int number, L;
scanf("%d %d", &number, &L);
//建立邻接表
qV *q = NULL;
q=Create(q, number+1);
//建立数组
int m[10001] = {0};
//插入元素
int a, b;
for (int i = 0; i < L; i++)
{
scanf("%d %d", &a, &b);
Insert(&q, a, b);
Insert(&q, b, a);
}
//建栈
qStack p=NULL;
CreateStack(&p,number);
//便利六层
for (int i = 1; i <= number; i++)
{
LookAll(q, &p, number, m, i);
(*p).top = 0;
(*p).end = 0;
}
system("pause");
return 0;
}