深度优先遍历
- 和树的先根遍历类似。
- 指定从一个顶点v开始访问,并用一个状态表来记录顶点是否被访问。当v被访问时,标记被访问。
- 当其邻接点未访问时,递归地访问其邻接点以及邻接点的邻接点……直到所有顶点都被访问。

- 例如,上图从顶点
v0
v
0
开始,深度优先遍历图的结果为:
v0→v1→v3→v2→v5→v6→v4
v
0
→
v
1
→
v
3
→
v
2
→
v
5
→
v
6
→
v
4
template<class T>
void Graph<T>::DepthFirstSearch(int start)
{
cout << "->V" << VSet[start].value;
visited[start] = true;
for (vector<Vertex<T>>::iterator iter=VSet[start].adj_list.begin();
iter!= VSet[start].adj_list.end(); ++iter)
{
if (!visited[iter->value])
DepthFirstSearch(iter->value);
}
}
附图的深度优先遍历实现C++
#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
template<class T>
class Vertex {
public:
T value;
vector<Vertex<T>> adj_list;
int weight;
Vertex(T value = 0) :value(value), weight(0){}
bool operator < (const Vertex<T> &v) const { return value < v.value; }
};
template<class T>
class Graph {
public:
vector<Vertex<T>> VSet;
Graph(int sz) :size(sz) {}
bool* visited;
void Construct();
void initVisited();
int getsize() { return size; }
void DepthFirstSearch(int start);
private:
int size;
};
template<class T>
void Graph<T>::Construct()
{
Vertex<int> V[] = { Vertex<int>(0), Vertex<int>(1), Vertex<int>(2), Vertex<int>(3),
Vertex<int>(4), Vertex<int>(5), Vertex<int>(6) };
for (int i = 1;i < 4;i++)
V[0].adj_list.push_back(V[i]);
V[0].adj_list[0].weight = 2;
V[0].adj_list[1].weight = 4;
V[0].adj_list[2].weight = 1;
V[1].adj_list.push_back(V[0]);
V[1].adj_list.push_back(V[3]);
V[1].adj_list.push_back(V[4]);
V[1].adj_list[0].weight = 2;
V[1].adj_list[1].weight = 3;
V[1].adj_list[2].weight = 10;
V[2].adj_list.push_back(V[0]);
V[2].adj_list.push_back(V[3]);
V[2].adj_list.push_back(V[5]);
V[2].adj_list[0].weight = 4;
V[2].adj_list[1].weight = 2;
V[2].adj_list[2].weight = 5;
for (int i = 0;i < 7;i++)
{
if (i == 3)
continue;
V[3].adj_list.push_back(V[i]);
}
V[3].adj_list[0].weight = 1;
V[3].adj_list[1].weight = 3;
V[3].adj_list[2].weight = 2;
V[3].adj_list[3].weight = 7;
V[3].adj_list[4].weight = 8;
V[3].adj_list[5].weight = 4;
V[4].adj_list.push_back(V[1]);
V[4].adj_list.push_back(V[3]);
V[4].adj_list.push_back(V[6]);
V[4].adj_list[0].weight = 10;
V[4].adj_list[1].weight = 7;
V[4].adj_list[2].weight = 6;
V[5].adj_list.push_back(V[2]);
V[5].adj_list.push_back(V[3]);
V[5].adj_list.push_back(V[6]);
V[5].adj_list[0].weight = 5;
V[5].adj_list[1].weight = 8;
V[5].adj_list[2].weight = 1;
for (int i = 3;i < 7;i++)
V[6].adj_list.push_back(V[i]);
V[6].adj_list[0].weight = 4;
V[6].adj_list[1].weight = 6;
V[6].adj_list[2].weight = 1;
for (int i = 0;i < 7;i++)
{
VSet.push_back(V[i]);
}
}
template<class T>
void Graph<T>::initVisited()
{
visited = new bool[size];
for (int i = 0;i < size;i++)
{
visited[i] = false;
}
}
template<class T>
void Graph<T>::DepthFirstSearch(int start)
{
cout << "->V" << VSet[start].value;
visited[start] = true;
for (vector<Vertex<T>>::iterator iter=VSet[start].adj_list.begin();iter!= VSet[start].adj_list.end(); ++iter)
{
if (!visited[iter->value])
DepthFirstSearch(iter->value);
}
}
int main()
{
Graph<int> G(7);
G.Construct();
G.initVisited();
cout << "The depth-first search on the Graph is: \n";
G.DepthFirstSearch(0);
cout << endl;
system("pause");
return 0;
}
The depth-first search on the Graph is:
->V0->V1->V3->V2->V5->V6->V4
请按任意键继续. . .