算法6.14 六度空间

第1关:算法6.12六度空间

#include<iostream>
#include<cstring>
using namespace std;

#define N  1000
#define M 100000
#define OVERFLOW -1
int n, m;
struct Edge{		//存储边的结构体
	int to;
	int next;
};
struct Node{		//存储点的结构体
	int id;
	int step;
};
struct sqQueue{		//队列的结构体
	Node *base;
	int front;
	int rear;
};

Edge edge[N];		//
int head[N];
int vis[N];
int cnt;
sqQueue Q;
void Init(){
	memset(head,-1,sizeof head);
	cnt=0;
}
void addEdge(int u,int v){	//添加边
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt++;
}
void InitQueue(sqQueue &Q){	//初始化队列
	Q.base = new Node[M];
	if(!Q.base)
		exit(OVERFLOW);
	Q.front = Q.rear = 0;
	return;
}
int QueueLength(sqQueue Q){		//求队列的长度
	return(Q.rear-Q.front+M)%M;
}
int EnQueue(sqQueue &Q,Node e){	//入队
	if((Q.rear+1)%M == Q.front)
		return 0;
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear+1)%M;
	return 1;
}
int DeQueue(sqQueue &Q){		//出队
	if(Q.front == Q.rear)
		return 0;
	Q.front = (Q.front+1)%M;
	return 1;
}
Node getHead(sqQueue Q){	//得到队列头部的元素
	return Q.base[Q.front];
}
void bfs()
{				//用bfs来搜索与初始点距离不超过7的点的个数占总数的百分比
/*******************************Begin****************************/
    int Visit_Num = 0,last,tail,cost = 0;

    vis[0] = true;
    Visit_Num ++ ;
    last = 0;

    InitQueue(Q);
    Node start = {0,0};
    EnQueue(Q,start);

    while(QueueLength(Q))
    {
        int u = getHead(Q).id;
        DeQueue(Q);

        for(int j = 0;j < n;j ++ )
            if(!vis[j])
            {
                bool flag = false;
                for(int w = head[u];w != -1;w = edge[w].next)
                    if(edge[w].to == j) 
                    {
                        flag = true;
                        break;
                    }
                
                if(flag) 
                {
                    EnQueue(Q,{j,j});
                    Visit_Num ++ ;
                    vis[j] = true;
                    tail = j;
                }
            }
        
        if(u == last) cost ++ ,last = tail;
        if(cost == 7) break;
    }
    
    printf("%.6lf",1.0 * Visit_Num / n);
/*******************************End******************************/
}
int main()
{
	//
	cin >> n >> m;
  	//n为顶点的数量,m为边的数量,点的编号从0-n-1
    Init();			//初始化
    int u,v;
    for(int i=0;i<m;i++)
	{
    	scanf("%d%d",&u,&v);		//输入两个相邻的点
    	addEdge(u,v);
    	addEdge(v,u);		//无向边
    }
    bfs();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值