六度空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值