7-7 六度空间 (30 分) “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
图1 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式: 输入第1行给出两个正整数,分别表示社交网络图的结点数N (1<$N$≤104,表示人数)、边数$M$(≤33×$N$,表示社交关系数)。随后的$M$行对应$M$条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到$N$编号)。
输出格式: 对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
输入样例: 1 2 3 4 5 6 7 8 9 10 10 9 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
输出样例: 1 2 3 4 5 6 7 8 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 #include <stdio.h> #include <stdlib.h> #define MAXVEX 10005 void CreateGraph ( ) ;int BFSTraverse (int i) ;int G[MAXVEX][MAXVEX],Nv,Ne;int visited[MAXVEX];int main () { int i,j; int count; double b; CreateGraph(); for ( i=1 ; i<=Nv; i++) { count = BFSTraverse(i); b = 100.0 *count/Nv; printf ("%d: %.2f%%\n" ,i,b); } return 0 ; } void CreateGraph () { int i,j; int v1,v2; scanf ("%d %d" ,&Nv,&Ne); for ( i=0 ; i<=Nv; i++) { for ( j=0 ; j<=Nv; j++) { G[i][j] = 0 ; } } for ( i=0 ; i<Ne; i++) { scanf ("%d %d" ,&v1,&v2); G[v1][v2] = 1 ; G[v2][v1]= G[v1][v2]; } } int BFSTraverse ( int i) { int q[MAXVEX]= {0 }; int rear=-1 ,front=-1 ; int j; int temp; int cnt ; int level; int last; int tail; for ( j=0 ; j<=Nv; j++) { visited[j] = 0 ; } visited[i] =1 ; cnt = 1 ; level = 0 ; last = i; q[++rear] = i; while ( front<rear ) { temp =q[++front]; for ( j=1 ; j<=Nv; j++) { if ( G[temp][j] && !visited[j]) { visited[j] = 1 ; q[++rear] = j; cnt ++; tail = j; } } if ( temp==last) { level ++; last = tail; } if ( level==6 ) { break ; } } return cnt; }