7-7 六度空间

输入格式:

输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤103,表示人数)、边数M(≤33×N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。

输出格式:

对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。

输入样例:

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%

思路: 这道题是让我们找到每个点距离不超过6的结点数占结点总数的百分比,可以想到用广搜来做,先从一个点出发,然后向外一圈一圈的扩散,直到第六圈,这样就可以得到所需的结点数,再用他去除总结点,注意这要保存2位小数,需要用double。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+5;
const int M = 33*N;
const int inf = 0x3f3f3f3f;
int g[N][N] ;
int n,m;
int vt[N];
void createGraph(){
	cin>>n>>m;
	for(int i = 1; i <= n; i++){//初始化 
		for(int j = 1; j <= n; j++){
			g[i][j] = inf;
		}
	}
	int a,b;
	for(int i = 1; i <= m; i++){
		cin>>a>>b;
		g[a][b] = 1;
		g[b][a] = 1;
	}
}
int bfs(int a){//广度搜索 
	queue<int> q;
	q.push(a);
	vt[a] = 1;
	int count = 1;
	int last = a;//最开始的圈末结点为a 
	int level = 0;
	int tail;
	while(!q.empty()){
		int k = q.front();
		q.pop();
		for(int i = 1; i <= n; i++){
			if(vt[i]==0&&g[k][i]==1){
				q.push(i);
				vt[i] = 1;
				count++;
				tail = i;//记录这一圈最后的位置 
			}
		}
		if(last == k){//到达了这一圈的末尾 
			level++;
			last = tail;
		}
		if(level==6){
			break;
		}
	}
	return count;
}
int main(){
	createGraph();
	for(int i = 1; i <= n ; i++){
		memset(vt,0,sizeof vt);//注意不要忘了每次都要将vt归0 
		int a = bfs(i);
		double b = a*1.0/n*100.0;
		printf("%d: %.2f%%\n",i,b);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值