7-7 六度空间 (30 分)

BFS广度优先搜索

方法一

计算每层的深度,然后统计深度小于等于6的数量。

#include
#include
#include
#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
#include
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;
}

你可能感兴趣的:(数据结构与算法题目集,BFS)