zoukankan      html  css  js  c++  java
  • 社交网络图中结点的“重要性”计算 (30 分) C++解法

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

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

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

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

    输入格式:

    输入第一行给出两个正整数N和M,其中N(≤10​4 )是图中结点个数,顺便假设结点从1到N编号;M(≤105​ )是边的条数。随后的M行中,每行给出一条边的信息,即该边连接的两个结点编号,中间用空格分隔。最后一行给出需要计算紧密度中心性的这组结点的个数K(≤100)以及K个结点编号,用空格分隔。

    输出格式:

    按照Cc(i)=x.xx的格式输出K个给定结点的紧密度中心性,每个输出占一行,结果保留到小数点后2位。

    输入样例:

    9 14
    1 2
    1 3
    1 4
    2 3
    3 4
    4 5
    4 6
    5 6
    5 7
    5 8
    6 7
    6 8
    7 8
    7 9
    3 3 4 9

    输出样例:

    Cc(3)=0.47
    Cc(4)=0.62
    Cc(9)=0.35

    代码:
    #include <iostream>
    #include <queue>
    #include <climits>
    #include <map>
    
    using namespace std;
    
    class Graph {
    public:
    
        Graph(int v, int e) : Vertex(v), Edge(e) {
            G = new int *[v];
            for (int i = 0; i < v; i++) {
                G[i] = new int[v];
                for (int j = 0; j < v; j++) {
                    G[i][j] = 0;
                }
            }
        }
        
        ~Graph(){
            for (int i = 0; i < Vertex; i++) {
                delete[] G[i];
            }
            delete[] G;
        }
    
        void Insert(int v1, int v2) {
            G[v1][v2] = 1;
            G[v2][v1] = 1;
        }
    
        double Importance(int v) {
            int distance[Vertex];
            for (int i = 0; i < Vertex; i++) {
                distance[i] = INT_MAX;
            }
            distance[v] = 0;
            int Visited[Vertex][Vertex];
            for (int i = 0; i < Vertex; i++) {
                for (int j = 0; j < Vertex; j++) {
                    Visited[i][j] = 0;
                }
            }
            map<int,int> visitedNode;
            queue<int> q;
            q.push(v);
            while (!q.empty()) {
                int temp = q.front();
                q.pop();
                for (int i = 0; i < Vertex; i++) {
                    if (G[temp][i] == 1 && Visited[temp][i] == 0 && visitedNode[i]==0) {
                        if (distance[i] > distance[temp] + 1)
                            distance[i] = distance[temp] + 1;
                        visitedNode[i]=1;
                        q.push(i);
                        Visited[temp][i] = 1;
                        Visited[i][temp] = 1;
                    }
                }
            }
            double sum = 0;
            for (int i = 0; i < Vertex; i++) {
                sum += distance[i];
            }
            return (Vertex - 1.0) / sum;
        }
    
    private:
        int Vertex;
        int Edge;
        int **G;
    };
    
    int main() {
        int vertex, edge;
        scanf("%d %d", &vertex, &edge);
        Graph graph(vertex, edge);
        int temp1, temp2;
        for (int i = 0; i < edge; i++) {
            scanf("%d %d", &temp1, &temp2);
            graph.Insert(temp1 - 1, temp2 - 1);
        }
        int num;
        scanf("%d", &num);
        int n;
        for (int i = 0; i < num; i++) {
            scanf("%d", &n);
            printf("Cc(%d)=%.2f
    ", n, graph.Importance(n - 1));
        }
    }
    
  • 相关阅读:
    Spring AOP
    Spring Bean的生命周期
    MySQL中的SQL的常见优化策略
    垃圾收集器
    JWT
    Zookeeper
    RabbitMQ原理介绍
    kafka 安装配置
    kafka 简介
    ELK logstash 各种报错
  • 原文地址:https://www.cnblogs.com/nonlinearthink/p/11003954.html
Copyright © 2011-2022 走看看