06-图3 六度空间
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1,表示人数)、边数M(≤,表示社交关系数)。随后的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%
1 //邻接矩阵储存图,广度优先遍历求6层内的结点数量 2 #include<stdio.h> 3 #include<stdlib.h> 4 #define Max 10005 5 6 int N, M; 7 int Graph[Max][Max] = {0}; 8 9 typedef struct QNode{ 10 int *data; 11 int rear, front; 12 int maxsize; 13 }*Queue; 14 15 void BuildGraph(){ 16 scanf("%d%d", &N, &M); 17 for(int i=0; i<M; i++){ 18 int e1, e2; 19 scanf("%d%d", &e1, &e2); 20 Graph[e1][e2] = Graph[e2][e1] = 1; 21 } 22 } 23 24 Queue BuildQ(){ 25 Queue Q = (Queue)malloc(sizeof(struct QNode)); 26 Q->data = (int*)malloc(sizeof(int)*N); 27 Q->rear = Q->front = 0; 28 Q->maxsize = N; 29 return Q; 30 } 31 32 void AddQ(Queue Q, int v){ 33 Q->rear = (Q->rear+1)%Q->maxsize; 34 Q->data[Q->rear] = v; 35 } 36 37 bool IsEmpty(Queue Q){ 38 return (Q->front == Q->rear); 39 } 40 41 int DeleteQ(Queue Q){ 42 Q->front = (Q->front + 1)%Q->maxsize; 43 return Q->data[Q->front]; 44 } 45 46 int BFS(int v){ 47 bool Visited[Max] = {false}; 48 int level = 0, last = v, tail; //level记录层数,last记录这一层的最后一个结点,tail记录下一层的最后一个结点 49 Queue Q = BuildQ(); 50 Visited[v] = true; 51 int cnt=1; 52 AddQ(Q, v); 53 while(!IsEmpty(Q)){ 54 v = DeleteQ(Q); //将一个父结点出队 55 for(int i=1; i<=N; i++){ //将它没有被遍历过的子结点入队 56 if(!Visited[i] && Graph[v][i]==1){ 57 Visited[i] = true; 58 AddQ(Q, i); 59 cnt++; 60 tail = i; 61 } 62 } 63 if(last==v){ //如果出队的是这一层的最后一个结点 64 level++; //层数加一 65 last = tail; //更新last 66 } 67 if(level==6) break; //满6层跳出循环 68 } 69 return cnt; 70 } 71 72 int main(){ 73 BuildGraph(); 74 for(int i=1; i<=N; i++){ 75 int cnt = BFS(i); 76 double per = (double)cnt / N * 100; 77 printf("%d: %.2lf%%\n", i, per); 78 } 79 return 0; 80 }

浙公网安备 33010602011771号