一般在涉及图论的算法题的时候都会用到遍历有关方面的思想!而DFS也是最常用的一种方法,下面简单地DFS算法作下简单的分析
DFS基本思想:DFS是一个递归的过程(当然也可以不用递归,而且效率更高,但是递归让我们更加容易理解,应用更加方便) 也是一个有回退的过程,对于一个无向连通图,访问图中某个顶点v0后,然后访问它的某一个邻接顶点v1,然后再从v1出发,访问v1的未访问过的邻接顶点(需要一个isVisited数组),如此下去,直至到达所有的领接顶点都被访问过。然后回退一步,回到前一次被访问的顶点,看是否还有没有访问的顶点,如果有,则从这个顶点出发,进行向上述的过程一样进行访问,如果没有,则再回退一步,进行类似的访问,直至所有的顶点都被访问为止!
DFS主要的数据结构有邻接表和临街矩阵
邻接矩阵数据结构 edge[ max ][ max ]
临街矩阵的数据结构vector<vector<int> > edge; 或 更高级的 map<string, vector<string> > edge; 下标为非整型
实现的伪代码:
1.如果图是用邻接表存储
dfs(顶点i)
{
visited[i]=1;
//p是i的边链表表头指针
while(p非空)
{
if(i顶点对应的另一个顶点没有被访问过,设为k)
{
//递归搜索前要准备的工作的代码在这些
dfs(k);
//回退过程中,应该在这里写代码!
}
p=p->next;
}
2 如果图是用邻接矩阵存储
dfs(顶点i)
{
visited[i]=1;
for(j=0;j<n;j++)
{ if(edge[i][j]<inf&&visited[j]!=1) //如果i到k之间有边链接,并且j没有被访问过
{ dfs(j);
}
}
}
能力有限 仅做参考 若有错误 多多指教!!