图的非递归遍历(深搜和广搜)

//
// Created by Coder
//

#include 
#include 
#include 
#include 

using namespace std;

class DirectedGraph{

private:
    // 最大顶点数
    const int V = 100000;


    // vector实现的邻接表的定义
    // 不考虑边权,存储类型为int型

    vector e[V];
    int visit[V];

    // 邻接表的初始化操作
    // 将起点为`i`的边链表全部清空
    void init() {
        for (int i=0; ie[i][0]`
            for (int j=0; j<(int)e[i].size(); ++j) {
                if (e[i][j] == k) {     // 查询边`i->k`
                    return true;
                }
            }
        }
        return false;
    }

    int GetFirstNotVisit(int v) {
        for (int j=0; j s;
        s.push(v);
        while (!s.empty()) {
            //找到下一个待访问的邻接点
            int next = GetFirstNotVisit(s.top());
            if (next != -1) {   //还能继续深搜(未达到最大深度),继续
                //找到栈顶元素第一个未被访问的临接点(也就是更深的邻接点),访问之
                Visit(GetFirstNotVisit(s.top()));
                //入栈
                s.push(GetFirstNotVisit(s.top()));
            } else {    //不能继续深搜下去,回溯
                //出栈(回溯)到能找到有邻接点未被访问的节点
                s.pop();
            }
        }
    }

    //整个图的深搜
    void DFSTraverse() {
        for (int i=0; i s;
        s.push(v);
        while (!s.empty()) {
            //取队首元素
            int front = s.front();
            //出队
            s.pop();
            //对于队首元素,访问其所有未访问的邻接点
            //将未访问的邻接点入栈
            for (int i=0; i

更新

加入泛型支持,节点类型要重载=和==运算符,代码有点粗糙,c++水平还是渣。根据严蔚敏的数据结构书中对广搜和深搜的定义书写,代码经过测试。

//
// Created by Coder on 2018/2/13.
//

#include 
#include 
#include 
#include 

using namespace std;

template 
class DirectedGraph{

private:
    //最大顶点数
    const static int V = 10000;

    //当前的顶点数
    int VertexCount = 0;

    //存储所有的顶点
    vector vertexs;

    // vector实现的邻接表的定义
    // 注意edge[i]中的每一个元素都表示节点vertex数组中的下标
    // edge[i][j]表示 vertex[i]与vertex[edge[i][j]]有通路
    vector edge[V];
    //weight和数组edge一一对应
    //weight[i][j]表示 vertex[i]与vertex[edge[i][j]]通路的权
    vector weight[V];
    int visit[V];

public:

    DirectedGraph() {
        // 邻接表的初始化操作
        // 将起点为`i`的边链表全部清空
        for (int i=0; ij`
                    return true;
                }
            }
        }
        return false;
    }

    //打印顶点
    void PrintVertex() {
        for (int i=0; i"< s;
        s.push(index);
        while (!s.empty()) {
            //找到下一个待访问的邻接点下标
            int next = GetFirstNotVisit(s.top());
            if (next != -1) {   //还能继续深搜(未达到最大深度),继续
                //找到栈顶元素第一个未被访问的临接点(也就是更深的邻接点),访问之
                Visit(next);
                //入栈
                s.push(next);
            } else {    //不能继续深搜下去,回溯
                //出栈(回溯)到能找到有邻接点未被访问的节点
                s.pop();
            }
        }
    }

    //整个图的深搜
    void DFSTraverse() {
        for (int i=0; i s;
        s.push(index);
        while (!s.empty()) {
            //取队首元素
            int front = s.front();
            //出队
            s.pop();
            //对于队首元素,访问其所有未访问的邻接点
            //将未访问的邻接点入栈
            for (int i=0; i graph;
    int total, weight;
    char from, to;
    cin>>total;
    for (int i=0; i>from>>to;
        graph.InsertVertex(from);
        graph.InsertVertex(to);
        graph.InsertEdge(from, to, weight);
        graph.InsertEdge(to, from, weight);
    }
//    graph.PrintVertex();
//    graph.PrintEdge();
//    graph.DFSTraverse();
    graph.BFSTraverse();
}

你可能感兴趣的:(算法)