zoukankan      html  css  js  c++  java
  • 06-图3 六度空间 (30 分)

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。


    图1 六度空间示意图

    “六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。

    假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。

    输入格式:

    输入第1行给出两个正整数,分别表示社交网络图的结点数N(1,表示人数)、边数M(≤,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。

    输出格式:

    对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

    输入样例:

    10 9
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 9
    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%
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int maxn = 10010;
    
    int G[maxn][maxn] = {0};
    bool vis[maxn];
    int n,m;
    
    int BFS(int v){
        int count = 1;
        queue<int> q;
        q.push(v);
        vis[v] = true;
        int tail;
        int last = v;
        int level = 0;
        while(!q.empty()){
            int now = q.front();
            q.pop();
            for(int i = 1; i <= n; i++){
                if(!vis[i] && G[now][i] == 1){
                    vis[i] = true;
                    q.push(i);
                    tail = i;
                    count++;
                }
            }
            if(now == last){
                last = tail;
                level++;
            }
            if(level == 6){
                return count;
            }
        }
    }
    
    int main(){
        scanf("%d%d",&n,&m);
        int u,v;
        for(int i = 0; i < m; i++){
            scanf("%d%d",&v,&u);
            G[u][v] = G[v][u] = 1;
        }
        for(int i = 1; i <= n; i++){
            printf("%d: ",i);
            memset(vis,0,sizeof(vis));
            int count = BFS(i);
            double ratio = count *1.0/n*100;
            printf("%.2f%%
    ",ratio);
        }
        return 0;
    }
  • 相关阅读:
    poj 2411 Mondriaan's Dream 骨牌铺放 状压dp
    zoj 3471 Most Powerful (有向图)最大生成树 状压dp
    poj 2280 Islands and Bridges 哈密尔顿路 状压dp
    hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
    poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
    poj 1185 炮兵阵地 状压dp
    poj 3254 Corn Fields 状压dp入门
    loj 6278 6279 数列分块入门 2 3
    VIM记事——大小写转换
    DKIM支持样本上传做检测的网站
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10815726.html
Copyright © 2011-2022 走看看