BFS and CFS(c++)

注:基於鄰接表實現的bfs與dfs

Graph 結構

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
class Graph{
	int v;
	vector<vector<int>>adj;
	bool found;
public:
	Graph(int num):v(num){
		adj.resize(num);
	}
	void addedge(int s, int t){
		adj[s].push_back(t);
		adj[t].push_back(s);
	}
	void print(vector<int> &prev, int s, int t){
		if(prev[t]!=-1 && t != s)
		{
			print(prev,s,prev[t]);
		}
		cout<<t<<' ';
	}
	void bfs(int s,int t);
	void recurdfs(int w,int t,vector<bool>& visited,vector<int>& prev);
	void dfs(int s,int t);
};

BFS

void Graph::bfs(int s,int t){
	if(s == t)
		return;
	vector<bool> visited(v,false);
	visited[s] = true;
	vector<int> prev(v,-1);
	queue<int> ask;
	ask.push(s);
	while(!ask.empty())
	{
		int w = ask.front();
		ask.pop();
		for(int i=0;i<adj[w].size();i++)
		{
			int q = (adj[w]).at(i);
			if(!visited[q])
			{
				visited[q] = true;
				prev[q] = w;
				ask.push(q);
				if(q==t)
				{
					print(prev,s,t);
					return;
				}
			}
		}
	}
}

DFS

void Graph::recurdfs(int w,int t,vector<bool>& visited,vector<int>& prev){
	if(found == true)
		return;
	visited[w] = true;
	if(w == t)
	{
		found = true;
		return;
	}
	for(int i=0;i<adj[w].size();++i)
	{
		int elem = adj[w].at(i);
		if(!visited[elem])
		{
			prev[elem] = w;
			recurdfs(elem,t,visited,prev);
		}
	}
}
void Graph::dfs(int s,int t){
	if(s == t)
		return;
	found = false;
	vector<bool> visited(v,false);
	vector<int> prev(v,-1);
	recurdfs(s,t,visited,prev);
	print(prev,s,t);
}

main()

int main()
{
	Graph adjlist(4);
	for(int i=0;i<4;i++)
	{
		int s,t;
		cin>>s>>t;
		adjlist.addedge(s,t);
	}
//	adjlist.printself();
	adjlist.bfs(0,3);
	cout<<endl;
	adjlist.dfs(0,3);
	return 0;
}

case

input:
0 1
0 2
1 2
1 3
發佈了39 篇原創文章 · 獲贊 7 · 訪問量 4401
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章