《算法导论》BFS和DFS

说明:

BFS的图来自《算法导论》22-2;

DFS的图来自《算法导论》22-4;

C++11代码如下:

一、BFS


#include <iostream>
#include <vector>
#include <queue>
#include <forward_list>
using namespace std;

struct V				//顶点
{
	int parent = -1;
	int distance = -1;
}v[6];

queue<int> que;
vector<forward_list<int>> G = {{1,3},{4},{5,4},{1},{3},{5}};		//邻接链表

void print(int node)			//打印到结点node的路径
{
	if (node == 0)
		cout << "0 ";
	else if(v[node].parent == -1)
	{
		cout<<"No way";
		return;
	}
	else
	{
		print(v[node].parent);
		cout<<node<<" ";
	}
}

int main()
{
	v[0].distance = 0;
	que.push(0);			//把0结点加入到队列里
	while (!que.empty())
	{
		for(auto p : G[que.front()])	//在相邻结点里查找白色节点,处理其信息并加入队列
		{
			if (v[p].distance == -1)
			{
				que.push(p);
				v[p].distance = v[que.front()].distance + 1;
				v[p].parent = que.front();
			}
		}
		que.pop();
	}

	for(int i=0;i<6;++i)
	{
		print(i);
		cout<<endl;
	}
	return 0;
}

二、DFS


#include <iostream>
#include <forward_list>
#include <vector>
using namespace std;

struct Node
{
	int discover = 0,finish = 0;
	int parent = -1;
} node[6];

vector<forward_list<int>> G = {{1,3},{4},{4,5},{1},{3},{5}};		//邻接链表 
int time = 0;

void DFS(int i)
{
	for(auto p : G[i])					//搜索结点i的所有相邻结点 
	{
		if(node[p].parent == -1)		//找到一个白色结点,处理好其信息后就递归下去 
		{
			++time;
			node[p].discover = time;
			node[p].parent = i;
			DFS(p);
		}
	}
	++time;
	node[i].finish = time;				//邻接链表扫描完的时间 
}

void print(int i)						//打印信息 
{
	cout<<"node: "<<i<<endl;
	cout<<"parent: "<<node[i].parent<<endl;
	cout<<"discover/finish: "<<node[i].discover<<'/'<<node[i].finish<<endl<<endl;
}

int main()
{
	for(int i=0; i<6; ++i)
	{
		if(node[i].parent == -1)		//可能有多个源节点 
		{
			++time;
			node[i].discover = time;
			DFS(i);
		}
	}

	for(int i=0;i<6;++i)				//打印所有信息 
		print(i);
		
	return 0;
}


猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/80650740