Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2793230
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-10 20:27:10

基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一直进行到叶节点(即不能再生成新状态节点),当它仍不是目标状态G时,回溯到上一层结果,取另一可能扩展搜索的分支。生成新状态节点。若仍不是目标状态,就按该分支一直扩展到叶节点,若仍不是目标,采用相同的回溯办法回退到上层节点,扩展可能的分支生成新状态,…,一直进行下去,直到找到目标状态G为止。

点击(此处)折叠或打开

  1. 深度优先遍历算法
  2.   typedef enum{FALSE,TRUE}Boolean;//FALSE为0,TRUE为1
  3.   Boolean visited[MaxVertexNum]//访问标志向量是全局量
  4.   void DFSTraverse(ALGraph *G)
  5.   { //深度优先遍历以邻接表表示的图G,而以邻接矩阵表示G时,算法完全与此相同
  6.     int i;
  7.     for(i=0;i<G->n;i++)
  8.       visited[i]=FALSE; //标志向量初始化
  9.     for(i=0;i<G->n;i++)
  10.       if(!visited[i]) //vi未访问过
  11.         DFS(G,i)//以vi为源点开始DFS搜索
  12.    }//DFSTraverse

深度优先注意点,1、标志位的设置
                2、成功条件的终止
                3、恢复现场
                4、剪枝条件,重点难点
1、图中任一顶点都可能和其它顶点相邻接。在访问了某顶点之后,又可能顺着某条回路又回到了该顶点。为了避免重复访问同一个顶点,必须记住每个已访问的顶点。为此,可设一布尔向量visited[0..n-1],其初值为假,一旦访问了顶点Vi之后,便将visited[i]置为真。

2、栈在深度优先遍历算法中的作用
    深度优先遍历过程中,后访问的顶点其邻接点被先访问,故在递归调用过程中使用栈(系统运行时刻栈)来保存已访问的顶点。

算法分析
    对于具有n个顶点和e条边的无向图或有向图,遍历算法DFSTraverse对图中每顶点至多调用一次DFS或DFSM。从DFSTraverse中调用DFS(或DFSM)及DFS(或DFSM)内部递归调用自己的总次数为n。
    当访问某顶点vi时,DFS(或DFSM)的时间主要耗费在从该顶点出发搜索它的所有邻接点上。用邻接矩阵(数组)表示图时,其搜索时间为O(n);用邻接表表示图时,需搜索第i个边表上的所有结点。因此,对所有n个顶点访问,在邻接矩阵上共需检查n2个矩阵元素,在邻接表上需将边表中所有O(e)个结点检查一遍。
    所以,DFSTraverse的时间复杂度为O(n2) (调用DFSM)或0(n+e)(调用DFS)。
阅读(648) | 评论(0) | 转发(0) |
0

上一篇:mysql游标使用

下一篇:DFS搜索 hdu1241

给主人留下些什么吧!~~