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

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


    图1 六度空间示意图

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

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

    输入格式:

    输入第1行给出两个正整数,分别表示社交网络图的结点数NN(1<Nle 10^41<N104​​,表示人数)、边数MM(le 33 imes N33×N,表示社交关系数)。随后的MM行对应MM条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到NN编号)。

    输出格式:

    对每个结点输出与该结点距离不超过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%
    /* 题意: 找到一个图中每个节点通过最多5条边 能找到的所有节点  然后输出百分比
       思路:广搜  记录层数为6以内的所有节点
       本题的关键在于 如何记录节点当前的层数 
       1. 引入2个变量 last tail 分别指向 当前层数的最后一个元素  和 下一层的最后一个
       元素 
       2. 若当前出队的元素与last相等 则说明即将进入下一层 将last更新为tail 更新tail 重复~~知道level = 6 或者队列空
    */
    #include "iostream"
    #include "stdio.h"
    #include "queue"
    using namespace std;
    bool map[10001][10001] = {false};
    int n, m;
    int Count;
    void bfs(int x) {
        bool visited[10001] = { false };
        queue<int>q;
        q.push(x);
        visited[x] = true;
        int level = 0; /* 记录层数 */
        int last = x; /* 记录当前层数的最后一个元素 */
        int tail; /* 指向下一层最后一个元素 */
        while (!q.empty()) {
            x = q.front();
            q.pop();
            for (int i = 1; i <= n; i++) {
                if (!visited[i] && map[x][i] == 1) {
                    q.push(i); /* 进队 */
                    Count++;
                    visited[i] = true;
                    tail = i;
                }
            }
            if (last == x) {
                level++;
                last = tail;
            }
            if (level == 6)
                break;
        }
    }
    int main() {
        cin >> n >> m;
        for (int i = 0; i < m; i++) { 
            int k, l;
            cin >> k >> l;
            map[k][l] = 1;
            map[l][k] = 1;
        }
        for (int i = 1; i <=n; i++) { /* 对于所有节点 做bfs() */
            Count = 1;
            bfs(i);
            cout << i << ": ";
            float answer = (float)Count / n * 100;
            printf("%.2f%%
    ", answer);
        }
        return 0;
    }
     
  • 相关阅读:
    Springboot 之 自定义配置文件及读取配置文件
    SQLSERVER系统视图 sql server系统表详细说明
    MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
    使用Ecplise git commit时出现"There are no stages files"
    maven添加sqlserver的jdbc驱动包
    java将XML文档转换成json格式数据
    java将XML文档转换成json格式数据
    cannot be resolved. It is indirectly referenced from required .class files
    org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date "2012-12-
    @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  • 原文地址:https://www.cnblogs.com/minesweeper/p/5937439.html
Copyright © 2011-2022 走看看