【源代码】C++算法(八)用邻接矩阵定义图和深度广度遍历

日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
这里写图片描述
Graph.h
其中头文件”SqQueue.h”见算法四–队列。但其中我添加了一个判空函数。如下:
bool SqQueue::Qempty()
{
return this->front == this->rear;
}

#pragma once
#include<iomanip>
#include<iostream>
#include"SqQueue.h"
using namespace std;
#define max_v_num 100
#define INFINITY 10000
#define max 100
typedef int Boolean;
Boolean visited[max];

template <class T>
class Mgraph
{
public:
    Mgraph();//构造空图
    Mgraph(int vexs_num, int edge_num);
    T& GetVexs(int i);
    int weight(int i, int j);
    /*friend ostream &operator<<<>(ostream& out, Mgraph<T>&);*/
    void DFS(Mgraph<T>&, int i);
    void DFSTraverse(Mgraph<T>&);
    void BFSTraverse(Mgraph<T>&);

//private:
    int vexs_num, edge_num;
    T vexs[max_v_num];
    int arc[max_v_num][max_v_num];
};

template<class T>
Mgraph<T>::Mgraph()
{
    this->vexs_num = 0;
    this->edge_num = 0;
    /*T vexs[max_v_num];
    T arc[max_v_num][max_v_num];*/
}

template<class T>
 Mgraph<T>::Mgraph(int vexs_num, int edge_num)
{
     this->vexs_num = vexs_num;
     this->edge_num = edge_num;
    cout << "请输入各顶点:";
    for (int i = 0; i < vexs_num; i++)
    {
        cin >> vexs[i];
    }
    for (int i = 0; i < vexs_num; i++)  //邻接矩阵初始化
    {
        for (int j = 0; j < edge_num; j++)
        {
            this->arc[i][j] = INFINITY;
        }
    }
    cout << "请输入邻接矩阵下标i,j以及权值:" << endl;
    for(int k = 0; k < edge_num; k++)   //写入邻接矩阵元素
    {   

        int i, j;
        int w;
        cin >> i >> j >> w;
        arc[i][j] = w;
    }
}

template<class T>
 T& Mgraph<T>::GetVexs(int i)
{
    return this->vexs[i];
}

template<class T>
int Mgraph<T>::weight(int i, int j)
{
    return this->arc[i][j];
}

/*template<class T>
ostream &operator<<<>(ostream& out, Mgraph<T>&graph)//重载输出矩阵和顶点数组元素
{
    out << "顶点元素为:" << graph.vexs;
    out << "邻接矩阵为:\n";
    for (int i = 0; i < graph.vexs_num; i++)
    {
        for (int j = 0; j < length; j++)
        {
            int w;
            w = graph.weight(i,j)
            if (w == INFINITY)
            {
                out << setw(6)<<"∞"
            }
            else out << setw(6) << w;
        }
        out << "\n";
    }
    return out;
}*/

template<class T>
void Mgraph<T>::DFS(Mgraph<T>&Dgraph, int i)//邻接矩阵深度优先递归算法
{
    int j;
    visited[i] = true;
    cout << Dgraph.vexs[i];
    for ( j = 0; j < Dgraph.vexs_num; j++)
    {
        if (Dgraph.arc[i][j] != INFINITY && !visited[j])
        {
            DFS(Dgraph, j);
        }
    }
    return;
}
template<class T>
void Mgraph<T>::DFSTraverse(Mgraph<T>&DTgraph)//邻接矩阵的深度遍历操作
{
    int i;
    for ( i = 0; i < DTgraph.vexs_num; i++)
    {
        visited[i] = false;
    }
    for ( i = 0; i < DTgraph.vexs_num; i++)
    {
        if (!visited[i])
        {
            DFS(DTgraph, i);
        }
    }
    return;
}

template<class T>
void Mgraph<T>::BFSTraverse(Mgraph<T>&BFSgraph)//广度遍历
{
    int i, j;
    SqQueue queue;
    for ( i = 0; i < BFSgraph.vexs_num; i++)
    {
        visited[i] = false;
    }
    for ( i = 0; i < BFSgraph.vexs_num; i++)
    {
        if (!visited[i])
        {
            visited[i] = true;
            cout << BFSgraph.vexs[i];
            queue.EnQueue(i);
            while (!queue.Qempty())
            {
                queue.DeQueue(i);
                for (j = 0;  j< BFSgraph.vexs_num; j++)
                {
                    if (BFSgraph.arc[i][j]!=INFINITY && !visited[j])
                    {
                        visited[j] = true;
                        cout << BFSgraph.vexs[j];
                        queue.EnQueue(j);
                    }
                }
            }
        }
    }
    return;
}

Graph.cpp

#include"Graph.h"
#include<cstdlib>


int main()
{
    int vexs_num, edge_num;
    cout << "请输入顶点数和边数:";
    cin >> vexs_num >> edge_num;
    Mgraph<char>Graph(vexs_num, edge_num);
    cout << "图的顶点为:";
    for (int i = 0; i < vexs_num; i++)
    {
        cout << Graph.vexs[i];
    }
    cout << "输出邻接矩阵:"<<endl;
    for (int i = 0; i < Graph.vexs_num; i++)
    {
        for (int j = 0; j < Graph.vexs_num; j++)
        {
            int w;
            w = Graph.weight(i, j);
            if (w == INFINITY)
            {
                cout << setw(6) << "∞";
            }
            else cout << setw(6) << w;
        }
        cout << endl;
    }
    cout << "深度遍历结果为:";
    Graph.DFSTraverse(Graph);
    cout << endl;
    cout << "广度遍历结果为:";
    Graph.BFSTraverse(Graph);
    cout << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C语言实现深度优先遍历广度优先遍历的过程如下: 1.邻接矩阵定义 ```c #define MAXVEX 100 // 最大顶点数 #define INFINITY 65535 // 用65535来代表无穷大 typedef struct { int vexs[MAXVEX]; // 存储顶点的数组 int arc[MAXVEX][MAXVEX]; // 存储边的二维数组 int numVertexes, numEdges; // 中当前的顶点数和边数 } MGraph; ``` 2.深度优先遍历 ```c int visited[MAXVEX]; // 定义全局数组,记录每个顶点是否被访问过 void DFS(MGraph G, int i) { int j; visited[i] = 1; // 标记当前顶点已被访问 printf("%d ", G.vexs[i]); // 输出当前顶点的值 for (j = 0; j < G.numVertexes; j++) { if (G.arc[i][j] == 1 && !visited[j]) { // 如果当前顶点与j顶点有边,并且j顶点未被访问 DFS(G, j); // 递归访问j顶点 } } } void DFSTraverse(MGraph G) { int i; for (i = 0; i < G.numVertexes; i++) { visited[i] = 0; // 初始化visited数组 } for (i = 0; i < G.numVertexes; i++) { if (!visited[i]) { // 如果当前顶点未被访问 DFS(G, i); // 从该顶点开始进行深度优先遍历 } } } ``` 3.广度优先遍历 ```c void BFSTraverse(MGraph G) { int i, j; int queue[MAXVEX], front = 0, rear = 0; // 定义队列 for (i = 0; i < G.numVertexes; i++) { visited[i] = 0; // 初始化visited数组 } for (i = 0; i < G.numVertexes; i++) { if (!visited[i]) { // 如果当前顶点未被访问 visited[i] = 1; // 标记当前顶点已被访问 printf("%d ", G.vexs[i]); // 输出当前顶点的值 queue[rear++] = i; // 将当前顶点入队列 while (front != rear) { // 队列不为空时循环 j = queue[front++]; // 出队列 for (i = 0; i < G.numVertexes; i++) { if (G.arc[j][i] == 1 && !visited[i]) { // 如果当前顶点与i顶点有边,并且i顶点未被访问 visited[i] = 1; // 标记i顶点已被访问 printf("%d ", G.vexs[i]); // 输出i顶点的值 queue[rear++] = i; // 将i顶点入队列 } } } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值