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

基本思想:

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

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

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

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



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


code

/*
	图的构建及其广度优先搜索
*/
#include <stdio.h>
#include <stdlib.h>

#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;i<MAX_VERTEX_NUM;i++)	//邻接矩阵的初始化
	{
		for(j=0;j<MAX_VERTEX_NUM;j++)
		{
			G.arcs[i][j].adj=0;
			G.arcs[i][j].info=NULL;
		}
	}

	G.vertex[0]='a';				//顶点赋值
	G.vertex[1]='b';
	G.vertex[2]='c';
	G.vertex[3]='d';
	G.vertex[4]='e';
	G.vertex[5]='f';
	G.vertex[6]='g';
	G.vertex[7]='h';

	G.arcs[0][1].adj=1;				//邻接矩阵赋值
	G.arcs[0][1].info=NULL;
	G.arcs[1][0].adj=1;
	G.arcs[1][0].info=NULL;

	G.arcs[1][3].adj=1;
	G.arcs[1][3].info=NULL;
	G.arcs[3][1].adj=1;
	G.arcs[3][1].info=NULL;

	G.arcs[3][7].adj=1;
	G.arcs[3][7].info=NULL;
	G.arcs[7][3].adj=1;
	G.arcs[7][3].info=NULL;

	G.arcs[4][7].adj=1;
	G.arcs[4][7].info=NULL;
	G.arcs[7][4].adj=1;
	G.arcs[7][4].info=NULL;

	G.arcs[4][1].adj=1;
	G.arcs[4][1].info=NULL;
	G.arcs[1][4].adj=1;
	G.arcs[1][4].info=NULL;

	G.arcs[0][2].adj=1;
	G.arcs[0][2].info=NULL;
	G.arcs[2][0].adj=1;
	G.arcs[2][0].info=NULL;

	G.arcs[2][5].adj=1;
	G.arcs[2][5].info=NULL;
	G.arcs[5][2].adj=1;
	G.arcs[5][2].info=NULL;

	G.arcs[2][6].adj=1;
	G.arcs[2][6].info=NULL;
	G.arcs[6][2].adj=1;
	G.arcs[6][2].info=NULL;

	G.arcs[5][6].adj=1;
	G.arcs[5][6].info=NULL;
	G.arcs[6][5].adj=1;
	G.arcs[6][5].info=NULL;

	printf("Construction of Graph OK!\n\n");
	return;
}

void ShowAdjMat(MGraph G)			//邻接矩阵的显示
{
	int i,j;

	printf("The adjacent matrix is:\n");
	for(i=0;i<G.vertexnum;i++)
	{
		for(j=0;j<G.vertexnum;j++)
		{
			printf("%d ",G.arcs[i][j].adj);
		}
		printf("\n");
	}
	printf("\n");

	return;
}

void addnode(Queue* head,int v)		//链表添加新节点
{
	Queue* temp,*newnode;

	if(head==NULL)
	{
		head=(Queue*)malloc(sizeof(Queue));
		head->next=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<G.vertexnum;i++)
		{
			if(G.arcs[v][i].adj==1 && visted[i]!=true)
			{
				BFS(G,i);
			}
		}
		nextvid=GetNextVid(head);		
		BFS(G,nextvid);	
	}
	return;
}

void BFSTraverse(MGraph G)			//广度优先搜索
{
	int i;

	printf("The depth first traverse result is:\n");
	for(i=0;i<G.vertexnum;i++)
	{
		visted[i]=false;
	}

	for(i=0;i<G.vertexnum;i++)
	{
		if(visted[i]!=true)
		{
			BFS(G,i);
		}
	}
}

int main(void)
{
	MGraph G;

	CreateG(G);
	ShowAdjMat(G);
	BFSTraverse(G);

	printf("\n\n");
	system("pause");
	return 0;
}

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

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/cjc211322/article/details/21651775
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞