图论中的宽度优先搜索如何按给定层数进行?
06-图3 六度空间 (30 分)
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10100,M = 33*N;
int n,m;
int e[M],ne[M],idx,h[N];
bool st[N];
void add(int a,int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int bfs(int u)
{
int q[N]={0},hh=0,tt=-1;
memset(st,0,sizeof st);
// ---------------------------------
int cnt = 0;int num = 1;int last = u,tail; // key
// ---------------------------------
q[++tt] = u;
st[u] = true;
while(hh<=tt)
{
int t = q[hh++];
for(int i=h[t];i!=-1;i=ne[i])
{
int j = e[i];
if(st[j]==false)
{
q[++tt] = j;
num++;
st[j] = true;
//---------------
tail = j;
//--------------
}
}
// ----------------------------
if(t==last)
{
cnt++;
last = tail;
}
// --------------------------
if(cnt==6) break;
}
return num;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;cin>>a>>b;
add(a,b),add(b,a);
}
for(int i=1;i<=n;i++)
{
int k = bfs(i);
double prc = k*1.0/n;
printf("%d: %.2lf%\n",i,prc*100);
}
return 0;
}