4004.六度空间理论
Posted wind-chaser
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4004.六度空间理论相关的知识,希望对你有一定的参考价值。
六度空间理论
发布时间: 2018年11月26日 10:17 时间限制: 1000ms 内存限制: 128M
核心思想是使用BFS对邻接表扫描6层计数。
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
多组数据,每组数据m+1行。第一行有两个数字n和m,代表有n个人和m组朋友关系。n个人的编号为1到n。第二行到第m+1行每行包括两个数字a和b,代表这两个人互相认识。当n和m都等于0时,输入结束。
每组数据输出n行,对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
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: 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%
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 #define maxn 100 5 6 typedef struct node 7 { 8 int data; 9 struct node *next; 10 } Node; 11 12 Node *V[maxn];//邻接表 13 int visit[maxn]; 14 15 void BFS(int s, int n) 16 { 17 int count = 1; 18 Node *p; 19 memset(visit, 0, sizeof(visit)); 20 int Queue[maxn]; 21 int front = 0, rear = 0, last = 0; 22 Queue[0] = s; 23 visit[s] = 1; 24 int six = 0; 25 while (front <= last) 26 { 27 p = V[Queue[front++]]->next; 28 while (p)//单层遍历,一个人的所有朋友遍历,Queue存储其友 29 { 30 if (!visit[p->data]) 31 { 32 count++;//计数加一 33 visit[p->data] = 1;//改变访问状态 34 Queue[++rear] = p->data;//队尾赋值 35 } 36 p = p->next; 37 } 38 if (front>last)//判断此人的一度朋友是否遍历,如果遍历结束,进入其二度朋友 39 { 40 last = rear; 41 six++; 42 if (six == 6) 43 break; 44 } 45 } 46 printf("%d: %.2f%% ", s, count*100.0 / n); 47 } 48 49 int main() 50 { 51 int n, m; 52 int x, y; 53 Node *p; 54 while (1) 55 { 56 cin >> n >> m; 57 if (!n&&!m)break; 58 for (int i = 1; i <= n; i++) 59 { 60 V[i] =new Node; 61 V[i]->data = i; 62 V[i]->next = NULL; 63 }//set up 邻接表 index 64 while (m--) 65 { 66 cin>>x>>y; 67 p = new Node; 68 p->data = y; 69 p->next = V[x]->next; 70 V[x]->next = p;//y follow V[x] 71 p = new Node; 72 p->data = x; 73 p->next = V[y]->next; 74 V[y]->next = p;//x follow V[y] 75 } 76 for (int i = 1; i <= n; i++) 77 BFS(i, n); 78 } 79 return 0; 80 }
以上是关于4004.六度空间理论的主要内容,如果未能解决你的问题,请参考以下文章