图的遍历——主要有基于递归思想的深度优先递归算法和基于队列的广度遍历算法

#define MAXVEX 100 //最大顶点数
bool visited[MAXVEX];
typedef struct main
{
    int vexs[MAXVEX];          //顶点表,记录顶点信息,可以用vector记录,数据类型可根据具体情况确定
    int arc[MAXVEX][MAXVEX];   //邻接矩阵,可以使用vector<vector<int>>定义
    int numVertexes, numEdges; //顶点数和边数
} MGraph;

//图的遍历主要有基于递归思想的深度优先递归算法和基于队列的广度遍历算法
/***********深度优先递归算法****************/
//邻接矩阵的深度优先递归算法
void DFS(MGraph G, int i)
{
    visited[i] = true;
    printf("%c", G.vexs[i]); //打印顶点信息,也可以对顶点进行其他操作
    for (int j = 0; j < G.numVertexes; j++)
    {
        if (G.arc[i][j] == 1 && !visited[j]) //对为访问的邻接顶点递归调用
            DFS(G, j);
    }
}
void DFSTraverse(MGraph G)
{
    for (int i = 0; i < G.numVertexes; i++)
    {
        visited[i] = false; //初始将所有的顶点状态都设置为未访问状态
    }

    for (int i = 0; i < G.numVertexes; i++)
    {
        if (!visited[i]) //对未访问过的顶点调用DFS,若是连通图,则只执行依次DFS;若为非连通图,则有几个子图就执行几次
            DFS(G, i);
    }
}
//邻接表的深度遍历操作,如果图结构是邻接表结构,其DFSTraverse函数的代码几乎是相同的,知识递归函数中因为将数组变成了链表而不同
//GraphAdjList为邻接表结构,EdgeNode为边表节点
//边表结构
typedef struct EdgeNode
{
    int adjvex;            //邻接点域,存储该顶点对应的下标
    int weight;            //存储权值
    struct EdgeNode *next; //链表,指向下一个邻接点
} EdgeNode;
//顶点表结构
typedef struct VertexNode
{
    char data;           //顶点域,存储顶点信息,数据类型自定义
    EdgeNode *firstedge; //边表头指针
} VertexNode, AdjList[MAXVEX];
typedef struct
{
    AdjList adjList;
    int numVertexes, numEdges;
} GraphAdjList;

void DFS(GraphAdjList GL, int i)
{
    EdgeNode *p;
    visited[i] = true;
    printf("%c", GL->adjList[i].data); //打印顶点信息,也可以对顶点进行其他操作
    p = GL->adjList[i].firstedge;
    while (p)
    {
        if (!visited[p->adjvex])
            DFS(GL, p->adjvex); //对为访问的邻接顶点递归调用
        p = p->next;
    }
}
void DFSTraverse(MGraph G)
{
    for (int i = 0; i < G.numVertexes; i++)
    {
        visited[i] = false; //初始将所有的顶点状态都设置为未访问状态
    }

    for (int i = 0; i < G.numVertexes; i++)
    {
        if (!visited[i]) //对未访问过的顶点调用DFS,若是连通图,则只执行依次DFS;若为非连通图,则有几个子图就执行几次
            DFS(G, i);
    }
}
/***********深度优先递归算法****************/
//邻接矩阵的广度优先递归算法
void DFSTraverse(MGraph G)
{
    queue<int> Q;                               //队列存储的是顶点信息的下标
    vector<bool> visited(G.numVertexes, false); //初始化顶点状态为未访问
    for (int i = 0; i < G.numVertexes; i++)
    {                                //多个子图的话需要循环每个子图
        if (!visited[i])             //如果是连通图,则只要运行一次
        {                            //若是未访问就进行处理
            visited[i] = true;       //设置当前节点访问过
            printf("%c", G.vexs[i]); //打印访问的顶点信息,可对该顶点进行其他操作
            Q.push(i);               //该顶点入队列
            while (!Q.empty())
            {
                i = Q.front();
                Q.pop();
                for (int j = 0; j < G.numVertexes; j++)
                {
                    //判断其他节点若与当前顶点存在边且未被访问过
                    if (G.arc[i][j] == 1 && !visited[j])
                    {
                        visited[j] = true;
                        printf("%c", G.vexs[j]); //打印访问的顶点信息,可对该顶点进行其他操作
                        Q.push(j);               //将找到的顶点入队列
                    }
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值