7-36 社交网络图中结点的“重要性”计算 (30 分) (题目链接)
思路分析:
这道题看上去挺唬人,但实际上只是虚张声势。题目是无权图,因此用bfs算法判断图连通,求出d<i,j>之和,然后代入公式即可。
#include <iostream>
#include <cstring>
#include <queue>
#define MAX 10010
using namespace std;
int map[MAX][MAX];
int vis[MAX];
int N, M, num;
struct node
{
int v;
int level;
};
int bfs(int S)
{
memset(vis,0,sizeof(vis));
num = 0;
int cnt = 0;
queue<node> Q;
node head;
head.v = S, head.level = 0;
Q.push(head);
while(!Q.empty())
{
num++;
node tmp = Q.front();
vis[tmp.v] = 1;
// cout<<tmp.v<<" "<<tmp.level<<endl;
cnt += tmp.level;
Q.pop();
for(int i = 1;i <= N;i++)
{
if(map[tmp.v][i] && !vis[i])
{
node tmp1;
tmp1.v = i, tmp1.level = tmp.level+1;
vis[i] = 1;
Q.push(tmp1);
}
}
}
return cnt;
}
int main()
{
int x, y;
cin>>N>>M;
while(M--)
{
cin>>x>>y;
map[x][y] = 1;
map[y][x] = 1;
}
int K, r, cnt;
double ans;
cin>>K;
while(K--)
{
cin>>r;
cnt = bfs(r);
if(num < N)
{
printf("Cc(%d)=0.00\n",r);
}
else
{
ans = (double)(N-1)/(double)cnt;
printf("Cc(%d)=%.2lf\n",r,ans);
}
}
return 0;
}