欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的深度优先搜索

程序员文章站 2022-06-11 11:19:47
...

图的深度优先搜索与广度优先搜索相对应,其思想是先在一条路径上走到终点,然后再回过头走其他路径。如果图中有n个节点,e条边,那么用邻接表存储的图的时间复杂度为O(n+e),用邻接矩阵存储的图的遍历时间复杂度为O(n^2)。
这里实现了用邻接表存储的图的深度优先搜索:

void DFS()
    {
        size_t size = _v.size();
        if(size < 1)
            return;
        vector<bool> flags;
        flags.resize(size, false);
        for(size_t i = 0; i < size; i++)
            if(false == flags[i])
                _DFS(&_map[i], flags);
        cout << endl;
    }
    void _DFS(PNode pCur, vector<bool>& flags)
    {
        if(true == flags[pCur->_value])
            return;
        cout << _v[pCur->_value] << " ";
        flags[pCur->_value] = true;
        while(pCur->_Next)
        {
            if(false == flags[pCur->_Next->_value])
                _DFS(&_map[pCur->_Next->_value], flags);
            pCur = pCur->_Next;
        }
    }

建立一个无向图:

void test()
{
    Map<char, false> m("ABCDEFG");
    m.InsertEdge('A', 'B', 3);
    m.InsertEdge('A', 'D', 5);
    m.InsertEdge('C', 'B', 3);
    m.InsertEdge('C', 'G', 4);
    m.InsertEdge('D', 'F', 1);
    m.InsertEdge('G', 'E', 6);
    m.InsertEdge('F', 'C', 7);
    m.PrintMap();
    m.DFS();
}

遍历效果:
图的深度优先搜索