六度空间
输入格式:
输入第1行给出两个正整数,分别表示社交网络图的结点数N(1<N≤10
3,表示人数)、边数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%测试结果
BFS解题步骤
#include <cstring>
#include <iostream>
#include <queue>
#include <set>
#include <iomanip>
using namespace std;
#define MaxSize 1002
typedef int people;
int N,M;
int relation[MaxSize][MaxSize];
int connected[MaxSize];
int visited[MaxSize];
struct PNode{
set<people> p;
people layer[MaxSize][MaxSize];
}s[MaxSize];
void BFS(){
queue<int>connection;
people i;
for(i=1;i<=N;i++){
connection.push(i);
while(!connection.empty()){
people j;
people temp=connection.front();
visited[temp]=1;
connection.pop();
for(j=1;j<=N;++j){
if(relation[temp][j]==1&&!visited[j]){
connection.push(j);
s[i].p.insert(j);
visited[j]=1;
if(temp==i)
s[i].layer[i][j]=1;
else{
s[i].layer[i][j]=s[i].layer[i][temp]+1;
}
}
}
}
memset(visited,0, sizeof(visited));
}
}
int main(){
cin>>N>>M;
people p1,p2;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++)
relation[i][j]=0;
visited[i]=0;
connected[i]=0;
}
while(M--){
cin>>p1>>p2;
relation[p1][p2]=1;
relation[p2][p1]=1;
}
BFS();
for (int i = 1; i <=N ; ++i) {
for(int j = 1;j <=N ; ++j){
if(s[i].layer[i][j]<=6&&i!=j&&s[i].layer[i][j]!=0)
connected[i]++;
}
connected[i]++;
}
for (int i = 1; i <=N ; ++i) {
cout<<i<<": "<<setiosflags(ios::fixed)<<setprecision(2)<<connected[i]/(N*0.01)<<"%\n";
}
return 0;
}