题目链接:点击打开链接
题目大意:略。
解题思路
1、是否连通图:是,则继续2、3;否,则输出“0.00”。
2、所求的结点出发到其余的结点的最少边数(最短距离)的总和。
3、(n-1)/ 第2步的结果。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=1e4+100; struct node { int u,step; }; int vis[maxn]; int sum,cnt; vector<int> vec[maxn]; void bfs(int u) { node nd; nd.u=u; nd.step=0; queue<node> q; q.push(nd); cnt++; vis[u]=1; while(!q.empty()) { node fnt=q.front(); q.pop(); for(int i=0;i<vec[fnt.u].size();i++) { if(!vis[vec[fnt.u][i]]) { vis[vec[fnt.u][i]]=1; nd.u=vec[fnt.u][i]; nd.step=1+fnt.step; sum+=nd.step; cnt++; q.push(nd); } } } return; } int main() { int n,m,l,u,v; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } scanf("%d",&l); while(l--) { mem(vis,0); sum=cnt=0; scanf("%d",&u); bfs(u); if(cnt==n) printf("Cc(%d)=%.2f\n",u,(n-1)*1.0/sum); else printf("Cc(%d)=0.00\n",u); } } return 0; }