zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    hadoop之 hadoop日志存放路径
    grpc的数据包监控
    HTTP2 概述
    gRPC的简单Go例子
    win下环境变量的设置
    Go的pprof使用
    graphviz
    学习Golang的步骤建议
    golang 的 sync.WaitGroup
    【转】golang的channel的几种用法
  • 原文地址:https://www.cnblogs.com/wind-chaser/p/10066182.html
Copyright © 2011-2022 走看看