输入样例:
10 9
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
输出样例:
1: 70.00%
2: 80.00%
3: 90.00%
4: 100.00%
5: 100.00%
6: 100.00%
7: 100.00%
8: 90.00%
9: 80.00%
10: 70.00%
分析:
对每个点 bfs 前六层,为了使得 d 数组除了能表示距离,还能表示是否visted,所以d 从1 开始 。
用vector<int>e[N]; 邻接表,对一个点的bfs=O(m) ,总时间复杂度:O(n*m);
代码:
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int N=1010;
vector<int>e[N];
int d[1010];
queue<int>q;
int ans;
void bfs(){
while(q.size()){
int u=q.front(); q.pop();
for(int v:e[u]){
if(d[v]) continue;
q.push(v); d[v]=d[u]+1;
if(d[v]>7) return ;
ans++;
}
}
}
int main(){
int n,m; cin>>n>>m;
for(int i=0;i<m;i++){
int x,y; scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
for(int i=1;i<=n;i++){
memset(d,0,sizeof(d));
while(!q.empty()) q.pop();
ans=1;
q.push(i);d[i]=1;
bfs();
// cout<<"**"<<i<<" ";
// for(int i=1;i<=10;i++)
// printf("%d ",d[i]);
// cout<<endl;
float num=(float)ans*100/(float)n;
printf("%d: %.2f%%\n",i,num);
}
return 0;
}