图的邻接矩阵实现与深度优先遍历、广度优先

重点:

1、深度优先遍历——递归

2、广度优先遍历——队列

#include<bits/stdc++.h>
using namespace std;
const int MaxSize=10;//图中最多顶点的个数
int visited[MaxSize];
template<class DataType>
class Queue
{
public:
    DataType data[MaxSize];
    int front,rear;
};
template<class DataType>
class MGraph
{
private:
    DataType vertex[MaxSize];//存放图中顶点的数组
    int arc[MaxSize][MaxSize];//存放图中边的数组
    int vertexNum,arcNum;//图的顶点数和边数
public:
    MGraph(DataType a[],int vn,int an);//构造函数
    ~MGraph(){}
    void DFSTraverse(int v);//深度优先遍历
    void BFSTraverse(int v);//广度优先遍历
};
//构造一个图
template<class DataType>
MGraph<DataType>::MGraph(DataType a[],int vn,int an)
{
    vertexNum=vn;
    arcNum=an;
    for(int i=0;i<vertexNum;i++)
    {
        vertex[i]=a[i];//输入的数据为图的结点的编号
    }
    for(int i=0;i<vertexNum;i++)//初始化邻接矩阵
    {
        for(int j=0;j<vertexNum;j++)
        {
            arc[i][j]=0;//初始化邻接矩阵的边都是0
        }
    }
    for(int k=0;k<arcNum;k++)//依次输入每一条边
    {
        cout<<"输入该边依附的两个顶点:"<<endl;
        int i,j;
        cin>>i>>j;//输入边依附的两个顶点的编号
        arc[i][j]=1;//有边为1
        arc[j][i]=1;//无向图是对称矩阵
    }
}
//深度优先遍历
template<class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{

    cout<<"开始访问的顶点:"<<vertex[v]<<endl;
    visited[v]=1;
    for(int j=0;j<vertexNum;j++)
    {
        if(arc[v][j]==1&&visited[j]==0)
        {
            DFSTraverse(j);
        }
    }
}
//广度优先遍历
template<class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{

    Queue<int> Q;//定义一个队列,队列类的对象
    Q.front=Q.rear=-1;//假设采用顺序队列且不会发生溢出
    cout<<"开始访问的结点:"<<vertex[v]<<" ";

    visited[v]=1;

    Q.data[++Q.rear]=v;//结点v入队
    while (Q.front!=Q.rear)
     {

         v=Q.data[++Q.front];//将队头元素出队,并保存至V中
         for (int j=0; j<vertexNum; j++){
            if (arc[v][j]==1 && visited[j]==0 ) {
                  cout<<vertex[j]<<" ";
                  visited[j]=1;
                  Q.data[++Q.rear]=j;
            }
         }
      }

}

int main()
{
    int a[5]={0,1,2,3,4};
    MGraph <int> graph(a,5,4);
    for(int i=0;i<MaxSize;i++)
    {
        visited[i]=0;
    }
    graph.DFSTraverse(0);//从节点0开始深度优先遍历
    cout<<endl;
    for(int i=0;i<MaxSize;i++)
    {
        visited[i]=0;
    }
    graph.BFSTraverse(0);//从0结点开始广度优先遍历
    cout<<endl;

    return 0;
}

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值