BFS广度优先搜索
方法一
计算每层的深度,然后统计深度小于等于6的数量。
#include<bits/stdc++.h>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=10005;
int vis[maxn];
int deep[maxn];
vector<int> G[maxn]; //每行是个向量,所有行组成一个数组
int n,m;
int cnt;
int bfs(int id){
queue<int> q;
q.push(id);
vis[id]=1;
deep[id]=0;
while(!q.empty()){
int tmp = q.front();
q.pop();
for(int i=0;i<G[tmp].size();i++){
if(vis[G[tmp][i]]==0){
vis[G[tmp][i]]=1;
deep[G[tmp][i]]=deep[tmp] + 1;
q.push(G[tmp][i]);
}
}
}
for(int i=1;i<=n;i++){
if(deep[i]<=6) cnt++; //不超过6
}
return cnt;
}
int main(){
int u,v;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++){
cnt=0;
memset(vis,0,sizeof(vis));
memset(deep,INF,sizeof(deep));
printf("%d: %.2f%%\n",i,bfs(i)*100.0/n);
}
return 0;
}
方法2
根据浙江大学大学MOOC数据结构讲解,可以用三个变量来优化。
#include<bits/stdc++.h>
#include<queue>
using namespace std;
const int maxn=10005;
int G[maxn][maxn];
int n,m;
int vis[maxn];
int bfs(int x){
int last=x,tail,cnt=1,level=0,tmp;
vis[x]=1;
queue<int> q;
q.push(x);
while(!q.empty()){
tmp = q.front();
q.pop();
for(int i=1;i<=n;i++){
if(G[tmp][i]==1 && vis[i]==0){
vis[i]=1;
q.push(i);
tail = i; //下一层的尾结点
cnt++;
}
}
if(tmp == last){ //如果弹出来的顶点是 上一层的最后一个,则更新层数
last = tail;
level++; //当level为第一层的时候,实际已经把第一层的数量统计完了
}
if(level==6) break;
}
return cnt;
}
int main(){
int u,v;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
G[u][v]=G[v][u]=1;
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
printf("%d: %.2f%%\n",i,bfs(i)*100.0/n);
}
return 0;
}