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

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

在这里插入图片描述

输入格式:
输入第一行给出两个正整数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

思路
floyd求取每个节点到其余所有节点的距离,注意最后判图是否联通,若不是连通图输出的0也需要保留两位小数。

AC代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<map>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<cctype>
#include<string>
#include<stdexcept>
#include<fstream>
#include<sstream>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 10000007
#define debug() puts("what the fuck!")
#define dedebug() puts("what the fuck!!!")
#define ll long long
#define ull unsigned long long
#define speed {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); };
using namespace std;
const double PI = acos(-1.0);
const int maxn = 1e4 + 50;
const int N = 35;
const int INF = 0x3f3f3f3f;
const double esp_0 = 1e-6;
int gcd(int x, int y) {
	return y ? gcd(y, x % y) : x;
}
int lcm(int x, int y) {
	return x * y / gcd(x, y);
}
int g[maxn][maxn];
int vis[maxn];
int dis[maxn];
int n, m;
void init() {
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			if (i == j)g[i][j] = 0;
			else g[i][j] = INF;
		}
	}
}
void floyd() {
	for (int k = 1; k <= n; ++k) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) {
				if (g[i][j] > g[i][k] + g[k][j]) {
					g[i][j] = g[i][k] + g[k][j];
				}
			}
		}
	}
}
int main(){
	scanf("%d%d", &n, &m);
	init();
	for (int i = 1; i <= m; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		g[u][v] = g[v][u] = 1;
	}
	floyd();
// 	for (int i = 1; i <= n; ++i) {
// 		for (int j = 1; j <= n; ++j) {
// 			cout << g[i][j] << " ";
// 		}
// 		cout << endl;
// 	}
	int flag = 0;
	for (int i = 1; i <= n; ++i) {
		if (g[1][i] == INF) {
			flag = 1;
			break;
		}
	}
	int k;
	scanf("%d", &k);
	while (k--) {
		int num;
		scanf("%d", &num);
		double average = 0;
		double sum = 0;
		for (int i = 1; i <= n; ++i) {
			if (g[num][i] != INF) {
				sum += g[num][i];
			}
		}
		average = (double)(n - 1) / sum;
		if (flag == 1)printf("Cc(%d)=%.2lf\n", num, 0);
		else printf("Cc(%d)=%.2lf\n", num, average);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值