杭电六度空间

#include
#include
#include
#include
using namespace std;
int a[10001][10001];//顶点从1开始编号
int visited[10001];//visited数组用来表示某条边是否被访问 
int N,M,count;//节点数,边数 count用来计算一个人相连的人数


typedef struct link {
int front;
int rear;
int data[10001];
}node;


void init(node *q)
{
q->front = 0;
q->rear = 0;
}


void set(node *q,int i)//用于向data数组添加六度内的节点 
{
q->data[q->rear++] = i;
}


int get(node *q)
{
return q->data[q->front++];
}


int isequal(node *q)
{
if(q->front == q->rear)
return 0;
return 1;
}


void BFS(node *q,int cur)
{
int last = 0,tail = 0;
int i = 0,v = 0;
int level = 0;    //注意一旦声明一个变量要立即初始化 

set(q,cur);//将选定的节点加入数组中 ,即添加的是0度节点
last = cur;//选定的节点为上一个节点
visited[cur] = 1;//表示选定的节点已经访问,
while(isequal(q))
{
v = get(q);//v是正字查询的节点 
for(i = 1;i <= N;i++)
{
if(a[v][i] == 1 && visited[i] == 0)
{
tail = i;//实质是保存最后一个入队的结点
count++;
set(q,i);//把有需要的节点加入数组 
visited[i] = 1;//入队顶点标记    
}
}
//开始遍历下一层
if(v == last)//上一层最后一个入队的顶点出队则层数加1
        //访问到上一层最后一个节点 则表示与上一度所有有关系的
//人都已经加入到数组中,要动用下一层关系,data数组的
//运用实质为bfs
{
last = tail;
level++;//层数加1


if(level == 6) break;
}



int main()   //初始化地图 
{
int x1 = 0,x2 = 0;
cin>>N>>M;
for(int i = 1;i <= M;i++)
{
cin>>x1>>x2;
a[x1][x2] = a[x2][x1] = 1;
}

int i = 0,j = 0;
double percent = 0;

node *q;
q = (node *)malloc(sizeof(node));
init(q);

for(i = 1;i <= N;i++)
{
for(j = 1;j <= N;j++)
visited[j] = 0;
init(q);
count = 1;

BFS(q,i);
percent = (double)count/N;//类型转换 
printf("%d: %.2f%%\n",i,percent * 100);
}
return 0;
 } 

你可能感兴趣的:(数据结构与算法)