#include<iostream>
#include<string>
#include<list>
#include<queue>
#include<stack>
using namespace std;
class Graph
{
int n; //结点个数
list<int> *adj; //邻接表
public:
Graph(int _n)
{
n = _n;
adj = new list<int>[n];
}
~Graph()
{
delete adj;
}
void addEdge(int v, int w)
{
adj[v].push_back(w); //默认为有向图
//adj[w].push_back(v); //无向图的话
}
void DFSUtils(int s, bool *visited)
{
visited[s] = true;
cout<<s<<" ";
list<int>::iterator it;
for(it = adj[s].begin(); it != adj[s].end(); it++)
{
if(!visited[*it])
{
DFSUtils(*it,visited);
}
}
}
void DFS()
{
bool *visited = new bool[n];
for(int i = 0; i < n; i++)
{
visited[i] = false;
}
for(int i = 0; i < n; i++)
{
if(!visited[i])
{
DFSUtils(i,visited);
cout<<";"; //每个连通分量用";"分隔
}
}
}
void BFSUtils(int s,bool *visited)
{
queue<int> q;
visited[s] = true;
q.push(s);
list<int>::iterator it;
while(!q.empty())
{
s = q.front();
q.pop();
cout<<s<<" ";
for(it = adj[s].begin(); it != adj[s].end(); it++)
{
if(!visited[*it])
{
visited[*it] = true;
q.push(*it);
}
}
}
}
void BFS()
{
bool *visited = new bool[n];
for(int i = 0; i < n; i++)
{
visited[i] = false;
}
for(int i = 0; i < n; i++)
{
if(!visited[i])
{
BFSUtils(i,visited);
cout<<";"; //每个连通分量用";"分隔
}
}
}
void DFSUtils_iter(int s,vector<bool> &visited)
{
stack<int> stk;
stk.push(s);
cout<<s<<" ";
visited[s] = true;
list<int>::iterator it;
while(!stk.empty())
{
s = stk.top();
stk.pop();
for(it = adj[s].begin(); it != adj[s].end(); it++)
{
if(!visited[*it])
{
stk.push(*it);
cout<<*it<<" ";
visited[*it] = true;
}
}
}
}
void DFS_iter()
{
vector<bool> visited(n,false);
for(int i = 0; i < n; i++)
{
if(!visited[i])
{
DFSUtils_iter(i,visited);
cout<<";"; //每个连通分量用";"分隔
}
}
}
};
int main()
{
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.addEdge(4, 3);
g.addEdge(4, 2);
cout<<"图的深度优先"<<endl;
g.DFS();
cout <<"\n图的广度优先:"<<endl;
g.BFS();
cout<<"\n图的深度优先(非递归)"<<endl;
g.DFS_iter();
return 0;
}
结果:
//每个连通分量用";"分隔
1、有向图:
2、无向图:addEdge
要改成这样
void addEdge(int v, int w)
{
adj[v].push_back(w); //默认为有向图
adj[w].push_back(v); //无向图的话
}