第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;
}