一步一步学数据结构之n--n(图遍历--广度优先遍历)

 

今天给大家说下图的广度优先遍历(BFS):

    图的广度优先搜索是树的按层次遍历的推广,它的基本思想是:首先访问初始点vi,并将其标记为已访问过,接着访问vi的所有未被访问过的邻接点 vi1,vi2, …, vi t,并均标记已访问过,然后再按照vi1,vi2, …, vi t的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依次类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。

如图:

《一步一步学数据结构之n--n(图遍历--广度优先遍历)》

《一步一步学数据结构之n--n(图遍历--广度优先遍历)》

 

       首先发下用邻接链表法实现的广度优先遍历代码如果不理解邻接链表法,请在本博客数据结构系列中查找,里面有详细介绍),代码是基于本博客数据结构系列讲解邻接链表法实现图写的,大家可以把这段代码加在那些代码中就可以运行:

static void recursive_bfs(TLGraph* tGraph, int v, int visited[], LGraph_Printf* pFunc)
{
	LinkQueue* queue = LinkList_Create();
	
	if(NULL != queue)
	{
		LinkQueue_Append(queue, tGraph->v + v);
		
		while(0 < LinkQueue_Length(queue))
		{
			int i = 0;
			
			v = (LVertex**)LinkQueue_Retrieve(queue) - tGraph->v;
			
			pFunc(tGraph->v[v]);
			
			printf(", ");
			
			for(i=0; i<tGraph->la[v]; i++)
			{
				TListNode* node = (TListNode*)LinkList_Get(tGraph->la[v], i);
				
				if(!visited[node->v])
				{
					LinkQueue_Append(queue, tGraph->v + node->v);
					
					visited[node->v] = 1;
				}
			}
		}
	}
	
	LinkQueue_Destroy(queue);
}

void LGraph_BFS(LGraph* graph, int v, LGraph_Printf* pFunc)
{
	TLGraph* tGraph = (TLGraph*)graph;
	
	int* visited = NULL;
	
	int condition = (NULL != tGraph);
	condition = condition && (0 <= v) && (v < tGraph->count);
	condition = condition && (NULL != pFunc);
	condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int))));
	
	if(condition)
	{
		int i = 0;
		
		recursive_bfs(tGraph, v, visited, pFunc);
		
		for(i=0; i<tGraph->count; i++)
		{
			if(!visited[i])
			{
				recursive_bfs(tGraph, i, visited, pFunc);
			}
		}
		
		printf("\n");
	}
	
	free(visited);
}

 

最后发下用邻接矩阵法实现的广度优先遍历代码如果不理解邻接矩阵法,请在本博客数据结构系列中查找,里面有详细介绍),代码是基于本博客数据结构系列讲解邻接矩阵法实现图写的,大家可以把这段代码加在那些代码中就可以运行:    

static void recursive_bfs(TMGraph* tGraph, int v, int visited[], MGraph_Printf* pFunc)
{
	LinkQueue* queue = LinkQueue_Create();
	
	if(NULL != queue)
	{
		LinkQueue_Append(queue, tGraph->v + v);
		
		visited[v] = 1;
		
		while(0 < LinkQueue_Length(queue))
		{
			int i = 0;
			
			v = (MVertex**)LinkQueue_Retrieve(queue) - tGraph->v;
			
			pFunc(tGraph->v[v]);
			
			printf(", ");
			
			for(i=0; i<tGraph->count; i++)
			{
				if((0 != tGraph->matrix[v][i]) && (!visited[i]))
				{
					LinkQueue_Append(queue, tGraph->v + i);
					
					visited[i] = 1;
				}
			}
		}
	}
	
	LinkQueue_Destroy(queue);
}

void MGraph_BFS(MGraph* graph, int v, MGraph_Printf* pFunc)
{
	TMGraph* tGraph = (TMGraph*)graph;
	
	int* visited = NULL;
	
	int condition = (NULL != tGraph);
	condition = condition && (0 <= v) && (v < tGraph->count);
	condition = condition && (NULL != pFunc);
	condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int))));
	
	if(condition)
	{
		int i = 0;
		
		recursive_bfs(tGraph, v, visited, pFunc);
		
		for(i=0; i<tGraph->count; i++)
		{
			if(!visited[i])
			{
				recursive_bfs(tGraph, i, visited, pFunc);
			}
		}
		
		printf("\n");
	}
	
	free(visited); 
}

 

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