六度空间,统计一个图中所有顶点附近六步以内顶点占所有顶点的比例

#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#define MAX_VERTEX 100 //最大顶点数 
typedef struct QNode
{
	int data;
	struct QNode *next;
}QNode,*Queueptr;
typedef struct
{
	Queueptr front;
	Queueptr rear;
}LinkQueue;
typedef  struct ArcNode
{
	int adjvex;
	struct ArcNode *nextarc;
	//InfoType *info;
}ArcNode;
typedef struct VNode
{
	int data;
	//int visit;//当前位置的顶点访问情况 
	ArcNode *firstarc;
}AdjList[MAX_VERTEX];
typedef struct
{
	 AdjList vertices;
	 int vexnum,arcnum;//顶点数,弧数 
}ALGraph;
//void create_graph(ALGraph *G);
//void wide_traveser(ALGraph G); 
void Init_Queue(LinkQueue *Q)//用队列进出先后的特性记录每次扫描的顶点的顺序 
{
	Q->front=(Queueptr)malloc(sizeof(QNode));
	if(!Q->front)
	exit(0);
	Q->rear=Q->front;
	Q->front->next=NULL;
}
void EnQueue(LinkQueue *Q,int e)
{
	Queueptr q;
	q=(Queueptr)malloc(sizeof(QNode));
	if(!q)
	exit(0);
	q->data=e;
	q->next=NULL;
	Q->rear->next=q;
	Q->rear=q;
}
void DeQueue(LinkQueue *Q,int *e)
{
	Queueptr p;
	if(Q->front!=Q->rear)
	{
		p=Q->front->next;
		*e=p->data;
		Q->front->next=p->next;
		if(Q->rear==p)
		Q->rear=Q->front;
		free(p);	
	}
}
bool Empty_Queue(LinkQueue Q)
{
	return !(Q.front==Q.rear);
}
void DestoryQueue(LinkQueue *Q)
{
	while(Q->front)
	{
		Q->rear=Q->front->next;
		free(Q->front);
		Q->front=Q->rear;
	}
}
void create_graph(ALGraph *G,int n,int m)
{
	//int n=0,m=0;
	int con1,con2;
	int i=0;
	//ArcNode *arc1;//用于根据输入的顶点关系向边结点插入结点 
	ArcNode *arc2;
	//scanf("%d%d",&n,&m);
	G->arcnum=n;
	for(i=1;i<=n;i++)
	{
		G->vertices[i].data=i;
		G->vertices[i].firstarc=NULL;
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&con1,&con2);
		//头插法插入边结点 
		//arc1=G->vertices[con1].firstarc;
		arc2=(ArcNode*)malloc(sizeof(ArcNode));
		arc2->adjvex=con2;
		arc2->nextarc=G->vertices[con1].firstarc;
		G->vertices[con1].firstarc=arc2;
		//根据对称性完成con2的边结点拼接 
		arc2=(ArcNode*)malloc(sizeof(ArcNode));
		arc2->adjvex=con1;
		arc2->nextarc=G->vertices[con2].firstarc;
		G->vertices[con2].firstarc=arc2;	 
	}
}

void wide_traveser(ALGraph *G)
{
	int i=0,j=0,k=0;
	char c='%';
	int visit[120];
	int count=0,temp=0;
	int countfloor=0,countfloor1=0;
	ArcNode *p;
	LinkQueue Q;
	for(i=1;i<=G->arcnum;i++)
	{	
		Init_Queue(&Q);
		count=1;//每个顶点附近距离不超过六步的顶点个数,其中待计算顶点本身算是一个 
		countfloor=0;//记录1到6步距离所扫描的顶点个数
		for(j=1;j<=G->arcnum;j++)//将所有的顶点访问信息设置为未被访问
		visit[j]=0;
		
		p=G->vertices[i].firstarc;
		visit[i]=1;
		while(p)//统计距离要计算顶点一步距离的顶点个数 
		{
			visit[p->adjvex]=1;
			count++;
			countfloor++;
			EnQueue(&Q,p->adjvex);
			p=p->nextarc;	
		}
		//printf("%d %d\n",count,countfloor); 		
		for(j=2;j<=6;j++)//2到6步总共的顶点数 
		{
			countfloor1=countfloor;
			//printf("%d ",countfloor);
			for(k=1,countfloor=0;k<=countfloor1;k++)
			{
				DeQueue(&Q,&temp);
				//printf("%d ",temp);
				p=G->vertices[temp].firstarc;
				//printf("%d ",p->adjvex);
				while(p)
				{//printf("%d ",p->adjvex);
					if(visit[p->adjvex]==0)
					{
						visit[p->adjvex]=1;
						EnQueue(&Q,p->adjvex);
						count++;
						//printf("%d :%d ",i,p->adjvex);
						countfloor++;
					}
					p=p->nextarc;
				}	
			}
		}
		printf("%d: %.2lf%c",i,100*((double)count)/G->arcnum,c);
		
		printf("\n");		
		//
	}
}
#include"head.h"
int main()
{
	ALGraph G;
	int n=0,m=0;
	while(1)
	{
		scanf("%d%d",&n,&m);
		if(n==0&&m==0)
		break;
		create_graph(&G,n,m);
 		wide_traveser(&G); 
	}	
 	return 0;
 } 

```![在这里插入图片描述](https://img-blog.csdnimg.cn/0e832f6cfce244b2828cfb36666e9d96.png#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/cb394f0618ec4392a2d79d853f4b3c15.png#pic_center)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值