注:基于邻接表实现的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