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.六度空间理论的主要内容,如果未能解决你的问题,请参考以下文章

7-7 六度空间(30 分)

PTA-天梯赛训练六度空间(广搜)

数据结构 06-图3 六度空间 (30 分)

数据结构图 —— 编程作业 03 :六度空间

06-图3 六度空间

六度分离 Floyd多源最短路