无向图的广度优先遍历---邻接矩阵实现

基本思想:

1、从图中某个顶点V0出发,并访问此顶点;

2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

3、重复步骤2,直到全部顶点都被访问为止。

无向图的广度优先遍历---邻接矩阵实现_第1张图片

图1中深度遍历的结果为:a->b->c->d->e->f->g->h

code
/*
	图的构建及其广度优先搜索
*/
#include 
#include 

#define MAX_VERTEX_NUM 30

typedef int VrType;
typedef char VtType;
bool visted[MAX_VERTEX_NUM];		//搜索时的标记矩阵

typedef struct ARC					//用于表征图的连接关系
{
	VrType adj;						//连接关系
	ARC *info;						//附加信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct						//定义图的完整结构
{
	VtType vertex[MAX_VERTEX_NUM];	//顶点		
	AdjMatrix arcs;					//邻接矩阵
	int vertexnum,arcnum;			//弧线和顶点的数目
}MGraph;

typedef struct node					//FIFO链表(队列)
{
	int vid;
	struct node* next;
}Queue;

Queue* head=NULL; 

void CreateG(MGraph &G)				//创建图
{
	int i,j;

	printf("Construct the Graph...\n");
	G.vertexnum=8;
	G.arcnum=9;

	for(i=0;inext=NULL;
		head->vid=v;
	}
	else
	{
		temp=head;
		while(temp->next!=NULL)
		{
			temp=temp->next;
		}
		newnode=(Queue*)malloc(sizeof(Queue));
		newnode->next=NULL;
		newnode->vid=v;
	}
	return;
}

int GetNextVid(Queue* head)			//链表中获取下一结点,删除出队结点
{
	Queue* temp;
	int id;
	while(1)
	{
		if(head!=NULL)
		{
			id=head->vid;
			temp=head;
			head=head->next;
			free(temp);
		}
		else
		{
			break;
		}
		if(visted[id]!=true)
		{
			break;
		}
	}

	return id;
}

void BFS(MGraph G,int v)			//广度优先遍历
{
	int i;
	int nextvid;

	printf("%c ",G.vertex[v]);
	visted[v]=true;
	addnode(head,v);
	while(head!=NULL)
	{
		for(i=0;i
无向图的广度优先遍历---邻接矩阵实现_第2张图片

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