#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
//初始化邻接矩阵
void InitGraph( int n ,int **Graph) {
for( int i = 1; i <= n; i++ )
for( int j = 1; j <= n; j++ )
Graph[i][j] = 0;
}
//将对应的关系填入邻接矩阵
void InsertEdge( int i, int j ,int **Graph) {
Graph[i][j] = 1;
Graph[j][i] = 1;
}
//传入起始点,行数,邻接矩阵,标记数组
double BFS( int curNode, int n ,int **Graph, int* visit) {
queue<int> visNode; //存储被访问过节点的队列
visit[curNode] = 1;
visNode.push( curNode );
int count = 1;
for( int level = 0; level < 6; level++ ) { //遍历6步
vector<int> vec;
while( !visNode.empty() ) {//将被访问过节点,放入向量中,以便访问中间元素
int node = visNode.front();
vec.push_back( node ); //在vec尾部加入node
visNode.pop(); //清空访问的节点队列
}
for( int i = 0; i < vec.size(); i++ ) {
int node = vec[i];
for( int i = 1; i <= n; i++ ) { //遍历n个节点,将node能够访问到的新节点存入队列中
if( !visit[i] && Graph[node][i] == 1 ) {
visNode.push( i ); //将该节点能够访问到的节点存入队列中
visit[i] = 1; //标记改点已经访问过
count++;//访问一个新的节点时,进行计数
}
}
}
}
double rate = (double)count / (double)n; //计算百分比
return rate * 100.0;
}
int main() {
int nodenum, routenum;
cin>>nodenum>>routenum;
int *visit = new int [nodenum+1];//标记数组
int **Graph = new int* [nodenum+1];//邻接矩阵
for (int i = 1; i <= nodenum; i++)
{
Graph[i] = new int[nodenum+1];
}
InitGraph(nodenum, Graph);
int a, b;
for( int i = 0; i < routenum; i++ ) {
cin>>a>>b;
InsertEdge( a, b ,Graph);
}
for( int i = 1; i <= nodenum; i++ ) {
memset(visit, 0, sizeof(visit[0])*(nodenum+1)); //初始化
double r = BFS(i, nodenum ,Graph, visit); //传入起始点,节点总个数,邻接矩阵,标记数组
printf("%d: %.2lf%%\n", i, r);//输出结果
}
return 0;
}
六度空间
最新推荐文章于 2021-12-22 19:54:53 发布