深度优先(DFS)
深度优先算法
-原料:class LinkStack<T>;
-步骤:
-将起始顶点压入栈中
-弹出栈顶顶点v,判断是否已经标记(标记:转2,为标记:转3)
-标记顶点v,并将顶点v的邻接顶点压入栈中
-判断栈是否为空(非空:转2,空:结束)
深度优先算法示例
SharedPointer<Array<int>> DFS(int i)
{
DynamicArray<int>* ret = NULL;
if((0 <= i) && (i < vCount()))
{
LinkStack<int> s;
LinkQueue<int> r;
DynamicArray<bool> visited(vCount());
for(int j =0;j<visited.length();j++)
{
visited[j] = false;
}
s.push(i);
while(s.size() > 0)
{
int v = s.top();
s.pop();
if(!visited[v])
{
SharedPointer<Array<int>> aj = getAdjacent(v);
for(int j=aj->length()-1;j>=0;j--)
{
s.push((*aj)[j]);
}
r.add(v);
visited[v] = true;
}
}
ret = toArray(r);
}
else
{
//抛出异常
}
return ret;
}
递归版深度优先
-定义功能:DFS(graph,vex)
·以顶点vex为起始顶点深度优先遍历graph
template<typename V,typename E>
void DFS(Graph<V,E>& g,int v,Array<bool>& visited)
{
if((0 <= v) && (v < g.vCount()))
{
cout << v<< endl;
visited[v] = true;
SharedPointer<Array <int>> aj = g.getAdjacent(v);
for(int i = 0;i<aj->length();i++)
{
if(!visited[(*aj)[i]])
{
DFS(g,(*aj)[i],visited);
}
}
}
else
{
//抛出异常
}
}
template<typename V,typename E>
void DFS(Graph<V,E>& g,int v)
{
DynamicArray<bool> visited(g.vCount());
for(int i = 0;i<visited.length();i++)
{
visited[i] = false;
}
DFS(g,v,visited);
}
总结:
-深度优先按照“先序遍历的方式”对顶点进行访问
-深度优先算法的核心是栈的使用
-深度优先和广度优先的唯一不同在于栈队列的使用
-深度优先算法可以使用递归的方式实现