7-7 六度空间 (30 分)

本文探讨了六度空间理论,并介绍了两种方法,包括利用BFS广度优先搜索进行实现。方法一是通过计算每层节点的深度,统计小于等于6的层数;方法二是基于浙江大学MOOC数据结构课程的优化方案,使用三个变量提高效率。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值