从图中某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发,深度优先搜索遍历图,直至图中所有和v有路径相通且未被访问的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
#include<vector>
struct GraphNode
{
int label;
std::vector<GraphNode*> neighbors;
GraphNode(int x) : label(x) {};
};
void DFS_Graph(GraphNode * node, int visit[])
{
visit[node->label ]= 1;
printf("%d ", node->label);
for (int i = 0; i < node->neighbors.size(); i++)
{
if (visit[node->neighbors[i]->label]==0)
{
DFS_Graph(node->neighbors[i],visit);
}
}
}
int main()
{
const int MAX_N = 5;
GraphNode* Graph[MAX_N];
for (int i = 0; i < MAX_N; i++)
{
Graph[i] = new GraphNode(i);
}
Graph[0]->neighbors.push_back(Graph[4]);
Graph[0]->neighbors.push_back(Graph[2]);
Graph[1]->neighbors.push_back(Graph[0]);
Graph[1]->neighbors.push_back(Graph[2]);
Graph[2]->neighbors.push_back(Graph[3]);
Graph[3]->neighbors.push_back(Graph[4]);
Graph[4]->neighbors.push_back(Graph[3]);
int visit[MAX_N] = {0};
for (int i = 0; i < MAX_N; i++)
{
if (visit[i]==0)
{
printf("From label(%d): ", Graph[i]->label);
DFS_Graph(Graph[i],visit);
printf("\n");
}
}
for (int i = 0; i < MAX_N; i++)
{
delete Graph[i];
}
return 0;
}
运行结果:
From label(0): 0 4 3 2
From label(1): 1