输入格式:
输入第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;
}