PTA 7-36 社交网络图中结点的“重要性”计算(图的BFS)

本题考点:

  • 图的BFS

在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同。

“紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值。在有N个结点的网络中,结点v?i的“紧密度中心性”Cc(v?i)数学上定义为v?i到其余所有结点v?j?? (j≠i) 的最短距离d(v?i ,v?j )的平均值的倒数:

对于非连通图,所有结点的紧密度中心性都是0。

给定一个无权的无向图以及其中的一组结点,计算这组结点中每个结点的紧密度中心性。

本题乍一看是全剧最短路径,但是由于题目给的点有了 104 个点,所以不能采用 Flyod 算法,而且保存图的时候,要采用邻接表来表示,不能采用邻接矩阵,因为内存会超过。

然后我们采用 BFS来进行遍历,由于所有的路径的长度都为 1,所以采用BFS 计算的时候可以直接看作是不同的层,每过一层,路径的长度就加 1,如果最终遍历到的点不够 N-1,那么说明有些点不能到达,就是非连通图。

完整代码如下:

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

#define maxn 10010

vector<int> G[maxn]; // 记录图 G,1 表示连通,0 表示不连通
bool vis[maxn];

double BFS(int start, int N)
{
    fill(vis, vis + maxn, false);
    queue<int> Q;
    int dis[N + 1], visit = 0; // 距离,访问的点数
    double sumDis = 0.0;
    vis[start] = true;
    Q.push(start);
    dis[start] = 0;
    while (Q.size() > 0)
    {
        int cur = Q.front();
        Q.pop();
        int nextId;
        for (int i = 0; i < G[cur].size(); i++)
        {
            nextId = G[cur][i];
            if(vis[nextId] == false)
            {
                Q.push(nextId);
                dis[nextId] = dis[cur] + 1;
                sumDis += dis[nextId];
                visit++;
                vis[nextId] = true;
            }
        }
    }
    double result = (double)(N - 1) / sumDis;
    if (visit != N - 1)
        return 0;
    else
        return result;
}

int main()
{
    int N, M;
    scanf("%d%d", &N, &M);
    int u, v;
    for (int i = 0; i < M; i++)
    {
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    int calNum;
    scanf("%d", &calNum);
    bool flag = false;
    while (calNum--)
    {
        int k;
        double cc;
        scanf("%d", &k);
        if (flag == false)
        {
            cc = BFS(k, N);
            printf("Cc(%d)=%.2f\n", k, cc);
        }
        else
        {
            printf("Cc(%d)=%.2f\n", k, 0.0);
        }
        if (cc == 0)
            flag = true;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/veeupup/p/12672348.html

时间: 2024-08-30 13:53:50

PTA 7-36 社交网络图中结点的“重要性”计算(图的BFS)的相关文章

PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同. “紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够

7-36 社交网络图中结点的“重要性”计算 (30分)

在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱.而结点根据其所处的位置不同,其在网络中体现的重要性也不尽相同. “紧密度中心性”是用来衡量一个结点到达其它结点的“快慢”的指标,即一个有较高中心性的结点比有较低中心性的结点能够更快地(平均意义下)到达网络中的其它结点,因而在该网络的传播过程中有更重要的价值.在有N个结点的网络中,结点v?i??的“紧密度中心性”(数学上定义为v?

进阶实验6-3.2 社交网络图中结点的“重要性”计算 (30分)-dijkstra算法

解题思路:(邻接矩阵存储) 用dijkstra算法依次求出每个结点到其余结点的最短距离 #include <stdio.h> #include <string.h> #define INF 0x3f3f3f3f #define MaxVex 1000+10 int G[MaxVex][MaxVex]; int visit[MaxVex]; int Nv,Ne; void Init() { memset(G,INF,sizeof(G)); int i; for(i=1; i<=

Hadoop 分析图中节点的重要性,求解图中节点三角形个数

Hadoop 求解无向图中节点的重要性,通过求解节点的三角形个数来展现: 求解图中节点重要性,并排序,在大数据,分布式处理大型图组织形式的数据时很重要,找出重要节点,并对重要节点做特殊处理是很重要的 下面讲解如何来求解 这篇文章分为三部分: 1,python生成无向图的邻接矩阵 2,python画出这个无向图 3,hadoop mapreduce 求解图中每个节点的三角形个数 关于hadoop求解矩阵相乘,请看之前的文章:http://blog.csdn.net/thao6626/article

友盟社交分享中的那些坑

友盟社交分享中的那些坑 目前在做的产品,新版本需要支持社交分享,其实旧版本已经有了,但是被屏蔽了,本来再次打开也没什么,但是发现新的需求要多支持一个平台,而旧平台的sdk又太旧了(接口都改了),为了节约时间,就考虑友盟社交分享,文档说快速集成只要10分钟. 下面呢,咱来说下具体使用友盟分享遇到的一些问题 首先是 产品需求 为了避免大伙看大段的需求文档,咱精简出和本文相关的需求 分享到微信好友 分享到微信朋友圈 分享到qq空间 分享到新浪微博 分享图片+文字 分享视频+文字 分享纯文字 点击分享出

HTML5移动开发之路(36)——jQuery中的DOM操作

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(36)--jQuery中的DOM操作 1.查询 利用选择器查找节点 使用 html() / text() / attr() 输出节点文本和属性值. 注意:下拉列表使用 val() [html] view plain copy print? <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery

36.在字符串中删除特定的字符

http://zhedahht.blog.163.com/blog/static/25411174200801931426484/ 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 分析:这是一道微软面试题.在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

数据结构开发(23):二叉树中结点的查找、插入、删除与清除操作

0.目录 1.二叉树中结点的查找操作 2.二叉树中结点的插入操作 3.二叉树中结点的删除操作 4.二叉树中结点的清除操作 5.小结 1.二叉树中结点的查找操作 查找的方式: 基于数据元素值的查找 BTreeNode<T>* find(const T& value) const 基于结点的查找 BTreeNode<T>* find(TreeNode<T>* node) const 树中数据元素和结点的查找: 基于数据元素值的查找: 定义功能:find(node,