算法导论—广度优先算法

#include <vector>
#include <queue>
#include <iostream>
#include <map>
#include <limits.h>

using namespace std;

enum{WHITE,GRAY,BLACK};

struct Vertex
{
	int color;
	int d;
	int pre;
	Vertex()
	:pre(-1),color(WHITE),d(INT_MAX)
	{ }
};

class bfsGraph
{
public:

	bfsGraph(int n)
	:vertexNum(n),vertexs(n)
	{ }

	int addEdge(int i,int j)
	{
		adj[i].push_back(j);
		adj[j].push_back(i);
		return 0;
	}


	int bfs(int start)
	{
		for(int i=0;i!=vertexNum;i++)
		{
			vertexs[i].color=WHITE;
			vertexs[i].d=INT_MAX;
			vertexs[i].pre=-1;
		}
		vertexs[start].color=GRAY;
		vertexs[start].d=0;
		vertexs[start].pre=-1;
		q.push(start);
		while(!q.empty())
		{
			int u=q.front();
			q.pop();

			for(auto v:adj[u])
			{
				if(vertexs[v].color==WHITE)
				{
					vertexs[v].color=GRAY;
					vertexs[v].d=vertexs[u].d+1;
					vertexs[v].pre=u;
					q.push(v);
				}
			}
			vertexs[u].color=BLACK;
		}
		cout<<"set ok"<<endl;
		return 0;
	}

	int printPath(int v,int start)
	{
		cout<<"The total length is :"<<vertexs[v].d<<endl;
		cout<<"The Path is: "<<endl;
		do
		{
			cout<<v<<endl;
			v=vertexs[v].pre;
		}while(v!=-1);
		return 0;
	}

	int printAdj()
	{
		for(auto k:adj)
		{
			cout<<k.first<<": ";
			for(auto v:k.second)
				cout<<v<<" ";
			cout<<endl;
		}
		return 0;
	}

private:
	int vertexNum;
	vector<Vertex> vertexs;
	map<int,vector<int>> adj;
	queue<int>q;

};
















测试cpp

#include <vector>
#include <iostream>
#include "bfs.h"

using namespace std;

int main()
{

	bfsGraph mybfs(8);
	mybfs.addEdge(0,1);
	mybfs.addEdge(1,2);
	mybfs.addEdge(2,3);
	mybfs.addEdge(3,4);
	mybfs.addEdge(3,5);
	mybfs.addEdge(4,5);
	mybfs.addEdge(4,6);
	mybfs.addEdge(4,7);
	mybfs.addEdge(5,6);
	mybfs.addEdge(6,7);
	mybfs.printAdj();
	mybfs.bfs(2);
	mybfs.printPath(7,2);
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值