数据结构与算法分析(八)——BFS算法

图的建立

图的组成:
顶点(Vertices)、边(Edges)

图的一些概念:
1.邻接(adjacent):v1和v2相连接
2.路径(path):一个顶点序列
3.圈(cycle):一个顶点出现了两次

图的表示:
1.邻接矩阵(空间大,但是速度快)
2.邻接表(空间小,但速度慢)

代码实现:
实现的是无权图
1.根据边的数目确定循环次数(一条边对应两个顶点)
2.用一个元素为vector的数据去组织数据,即每个顶点对应一个vector存放邻接顶点
3.每一次存放一条边对应的两个顶点

/**
 *@name Build_Graph:建立一个无权无向图 手动输入或者从二维数组中读取
**/
void Build_Graph()
{
	//手动输入图中的相邻节点
	/*
	int num;
	int n,m;
	cout<<"please input the edge num"<<endl;
	cin>>num;
	for(int i=0;i<num;i++)
	{
		cout<<"please input two Adjacent vertex"<<endl;
		cin>>n>>m;
		Graph[n].push_back(m);
		Graph[m].push_back(n);
	}*/

	//从二维数组中读取
	for(int i=0;i<12;i++)
	{
		Graph[vertex_couple[i][0]].push_back(vertex_couple[i][1]);
		Graph[vertex_couple[i][1]].push_back(vertex_couple[i][0]);
	}
}

BFS

广度优先遍历,搜索最短路径
算法描述:
1.给定起点和终点,从起点开始辐射;
2.利用队列去存放待辐射的顶点,首先应将起点推入队列;
3.从起点辐射到起点的所有邻接顶点,将起点推出队列(并标记已访问过),将所有邻接顶点(未访问过的)推入队列,并标记他们的上一顶点(为了最后的还原路径);
4.持续辐射,直到匹配到终点,然后利用之前标记的上一顶点,还原出最短路径;

代码实现:

/**
 *@name BFS:广度搜索
 *@param1 T:传入的邻接表
 *@param2 s0:起始位置
 *@param3 st:终止位置
**/
void BFS(vector<int> T[max_size],int s0,int st)
{
	queue<int> Q;
	int Know[10]={0};
	int v;
	int pre[10]={0};		//用来保存上一节点

	Q.push(s0);
	Know[s0]=1;
	while(!Q.empty())
	{
		v=Q.front();
		Q.pop();

		for(int i=0;i<T[v].size();i++)
		{
			if(Know[T[v][i]]==0)	//找到未访问过的节点
			{
				if(T[v][i]==st)
				{
					int temp=T[v][i];
					vector<int> result;
					pre[T[v][i]]=v;

					
					//将路径还原
					while(temp!=s0)				//一直迭代到初始值,将结果存放在vector中
					{
						result.push_back(temp);
						temp=pre[temp];		//从后往前还原路径
					}
					result.push_back(temp);	//保存初始值

					//输出最短路径
					cout<<"the path is "<<endl;
					vector<int>::iterator it;	//定义一个迭代器 从后向前迭代
					for(it=result.end()-1;it!=result.begin();it--)
					{
						cout<<*it<<" ";
					}
					cout<<*it<<endl;			//输出目标位置
					return;
				}
				else
				{
					Q.push(T[v][i]);			//推入队列
					Know[T[v][i]]=1;			//标记为已访问过
					pre[T[v][i]]=v;				//保存上一节点
				}
			}
		}
	}
}

未完待续。。。

发布了99 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44586750/article/details/103449090
今日推荐