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位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

样例输入1
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
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%%\n", 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 }

 

转载于:https://www.cnblogs.com/wind-chaser/p/10066182.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值