zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-36 社交网络图中结点的“重要性”计算 (30分)(使用BFS计算路径)

    1.题目

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

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

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

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

    输入格式:

    输入第一行给出两个正整数N和M,其中N(≤10​4​​)是图中结点个数,顺便假设结点从1到N编号;M(≤10​5​​)是边的条数。随后的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

    2.题目分析

    Cc(v​i​​)数学上定义为v​i​​到其余所有结点v​j​​ (j≠i) 的最短距离d(v​i​​,v​j​​)的平均值的倒数,意思就是需要求出待计算节点到其它所有剩余节点的最短距离的和,之后除以节点个数取倒数。

    开始的思路就是使用迪杰斯特拉算法,但是注意到图中各个相邻节点的距离都是1,那么我们就可以使用广度优先遍历,一层一层计算距离 

     3.代码

    
    //内存超限???
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<iomanip>
    #include<vector>
    using namespace std;
    #define INF 100000
    #define max 10001
    int edges[max][max];
    int path[max] = { 0 };
    int visited[max] = { 0 };
    double bfs(int n, int v)
    {
    	memset(visited, 0, sizeof(visited));
    	queue<int>qu;
    	visited[v] = 1;
    	qu.push(v);
    	path[v] = 0;
    	int cnt = 0;
    	double sum = 0;
    	while (!qu.empty())
    	{
    		int w = qu.front();
    		qu.pop();
    		for (int i = 1; i <= n; i++)
    		{
    			if (visited[i] == 0 && edges[w][i] != INF)
    			{
    				path[i] = 1 + path[w];
    				sum += path[i];
    				visited[i] = 1;
    				cnt++;
    				qu.push(i);
    			}
    		}
    	}
    	if (cnt != n - 1)return 0;
    	else return sum;
    
    
    }
    
    
    int main()
    {
    	int n, m;
    	cin >> n >> m;
    	int list[101];
    	int count = 0;
    	for (int i = 0; i <= n; i++)//这里不要使用i<max!!!!而用n,否则就会内存超限!
    	{
    		for (int j = 0; j <=n; j++)
    		{
    			edges[i][j] = INF;
    		}
    	}
    	for (int i = 0; i < m; i++)
    	{
    		int city1, city2;
    		cin >> city1 >> city2;
    		edges[city1][city2] = 1;
    		edges[city2][city1] = 1;
    
    	}
    	cin >> count;
    	for (int i = 0; i < count; i++)
    	{
    		cin >> list[i];
    	}
    	for (int i = 0; i < count; i++)
    	{
    		double isliaantongtu = bfs(n, list[i]);
    		if (isliaantongtu == 0)
    		{
    			cout << "Cc(" << list[i] << ")=0.00" << endl;
    		}
    		else
    		{
    			double answer = (n - 1) / isliaantongtu;
    			cout << "Cc(" << list[i] << ")=";
    			cout << fixed << setprecision(2) << answer << endl;
    		}//else
    	}
    
    
    }
    
    
  • 相关阅读:
    django 项目需要注意的一些点
    VUE之路
    Oracle 表格碎片的查看方法
    RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
    RMAN 修复主库 nologging 操作导致物理备库的坏块
    Oracle 数据库19c 回退降级到 11.2.0.4 方案
    如何评估oracle 数据库rman全备和增量备份大小
    在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
    Oracle 数据库坏块处理
    opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12789002.html
Copyright © 2011-2022 走看看