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;
}