[邻接矩阵形式]无向图的建立与深度,广度遍历

目录

MGraph类

构造函数

深度优先遍历

广度优先遍历



MGraph类

const int N = 10;
int visit[N]; // 顶点是否被访问
template<typename DataType>
class MGraph//无向图
{
public:
    MGraph(DataType a[], int n, int e);
    ~MGraph(){
	}
    void DF(int x); //深度优先遍历
    void BF(int x); //广度优先遍历

private:
    DataType v[N];  //存放图的顶点数据
    int vNum, edgeNum; //顶点数, 边数
    int edge[N][N]; //存放边, 0/1 无/有
} ;

构造函数

给定顶点数组,数量以及边的数量

注意:记得把边的双向都初始化为1  

        edge[j][k] = edge[k][j] = 1

template<typename DataType>
MGraph<DataType>::MGraph(DataType a[], int n, int e)
{
    vNum = n, edgeNum = e;
    for(int i = 0; i < n; i++){
        v[i] = a[i];
    }
    
    memset(edge, 0, sizeof edge);
    int j,k;
    for(int i = 0; i < e; i++)
    {
        cin >> j >> k;
        edge[j][k] = edge[k][j] = 1;
    }
}

深度优先遍历

本质是递归(栈),每条能走的(与x邻接的i满足edge[x][i]==1,且visit[i]==0即未被访问过)路都要走到黑(所有邻接的点全走过)

可以看一下以前做过的DFS的题, 思想是一样的

[DFS模板题] 全排列以及n-皇后问题_☆迷茫狗子的秘密基地☆-CSDN博客icon-default.png?t=L9C2https://blog.csdn.net/qq_39391544/article/details/120616653

template<typename DataType>
void MGraph<DataType>::DF(int x){
    cout << v[x] << endl;
    visit[x] = 1;

    for(int i = 0; i < vNum; i++)
    {
        if(edge[x][i] && !visit[i])
            DF(i);      
    }
}

广度优先遍历

本质是队列, 从选定的点开始一层一层(每次取出队头,并把其邻接的所有点都放入队列)进行遍历, 直至队列为空

可以看一下以前做过的BFS的题, 思想是一样的

[BFS模板题] 数组版/STL版 以及记录路线_☆迷茫狗子的秘密基地☆-CSDN博客icon-default.png?t=L9C2https://blog.csdn.net/qq_39391544/article/details/120631009

template<typename DataType>
void MGraph<DataType>::BF(int x){
    int Q[N];
    int front=-1, rear=-1;

    cout << v[x] << endl;
    visit[x] = 1;
    Q[++rear] = x;
    
    while(front != rear)
    {
        int t = Q[++front];
        for(int i = 0 ;i < vNum; i++)//邻接点全部放入队列中
        {
            if(edge[t][i] && !visit[i]){
                cout << v[i] << endl;
                visit[i] = 1;
                Q[++rear] = i;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/Knight02/p/15799059.html