BFS的思想:
从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1、V2、……Vn,然后依次访问与V1、V2……Vn相邻且未被访问的顶点。如此继续,找到所要找的顶点或者遍历完整个图。
由此可以看出,用BFS进行搜索所搜索的顶点都是按深度进行扩展的,先找到到V0距离为1的所有顶点,然后找到距离V0为2的顶点……所以BFS所搜索到的都是最短的路径。

由于要将距离V0为d(d>0)的且未被方位的点都记录起来,我们采用队列这种数据结构。队列的特点是先进先出(FIFO),从某个顶点出发,记此顶点已访问标记,然后依次搜索和此顶点相邻的且未被访问的顶点,将其加入队列,并置已访问标记,重复此步骤,直到找到需要搜索的顶点或者所有的顶点都被访问为止。

参考代码

void bfs(int k)
{
    int v[N]={0},i;     //N表示图的顶点个数 
    queue<int> q;
    v[k]=1;             //访问标记为1
    q.push(k);
    while(!q.empty()){
        k=q.front();
        q.pop();
        for(i=0;i<N;i++)
            if(a[k][i]==1&&!v[i]){       //a[k][i]表示顶点k,和i有关系
                q.push(i);
                v[i]=1;
            }
    }
}
View Code

 

DFS的思想:
顾名思义,深度优先搜索所遵循的策略就是尽可能“深”的在图中进行搜索,对于图中某一个顶点V,如果它还有相邻的顶点(在有向图中就是还有以V为起点的边)且未被访问,则访问此顶点。如果找不到,则返回到上一个顶点。这一过程一直进行直到所有的顶点都被访问为止。 DFS可以搜索出从某一个顶点到另外的一个顶点的所有路径。 由于要进行返回的操作,我们采用的是递归的方法。

int v[N]={0};
void dfs(int k)
{
    v[k]=1;
    for(i=0;i<N;i++)
        if(a[k][i]==1&&!v[i])
            dfs(i);
}
View Code

 


 

posted on 2014-07-30 17:01  happy_lcj  阅读(1751)  评论(0编辑  收藏  举报