图的深度优先和广度优先遍历

         以邻接矩阵的方式给出一张图,输出深度优先(DFS)和广度优先(BFS)遍历结果。

将邻接矩阵转化为邻接表的形式存储。

​
#include <iostream>
using namespace std;

class NODE
{
    int data;
    NODE* next;
public:
    NODE(int data=0)
    {
        this->data=data;
        this->next=nullptr;
    }
    friend class LIST;
    friend class QUEUE;
};
class QUEUE
{
    int num;
    int maxnum;
    int first;
    int last;
    NODE** data;
public:
    QUEUE(int num)
    {
        this->maxnum=num;
        this->num=0;
        this->first=0;
        this->last=0;
        data=new NODE*[num];
    }
    bool isfull()
    {
        return maxnum==num;
    }
    bool isempty()
    {
        return num==0;
    }
    void push(NODE* p)
    {
        if(isfull())return;
        data[last]=p;
        last++;
        num++;
    }
    NODE* pop()
    {
        if(isempty())return nullptr;
        num--;
        cout << data[first]->data << " ";
        return data[first++];
    }
    void print()
    {
        for(int i=0;i<num;i++)
        {
            cout << data[i]->data << " ";
        }
        cout << endl;
    }
    friend class LIST;
};

class LIST
{
    int num;
    NODE** dot;
public:
    LIST(int num=0,int** l=nullptr)
    {
        this->num=num;
        this->dot=new NODE*[num];
        for(int i=0;i<num;i++){
            dot[i]=new NODE(i);
            NODE* p=dot[i];
            for(int j=0;j<num;j++){
                if(l[i][j]==1&&i!=j){
                    NODE* q=new NODE(j);
                    p->next=q;
                    p=p->next;
                }
            }
        }
    }
    void DFS(int start,int* visited)
    {
        cout << dot[start]->data << " ";
        visited[start]=1;
        NODE* p=dot[start]->next;
        while(p){
            if(visited[p->data]!=1){
                DFS(p->data,visited);
            }
            p=p->next;
        }
    }
    void DFSprint()
    {
        cout << "DFS" << endl;
        for(int i=0;i<num;i++){
            int* visited=new int[num];
            DFS(i,visited);
            cout << endl;
        }
    }
    void BFS(int start)
    {
        int* visited=new int[num];
        QUEUE que(num);
        que.push(dot[start]);
        visited[start]=1;
        while(!que.isempty())
        {

            NODE* p=que.pop();
            while(p->next!=nullptr)
            {
                if(visited[p->next->data]==0)
                {
                    que.push(dot[p->next->data]);
                    visited[p->next->data]=1;
                }
                p=p->next;
            }
        }
    }
    void BFSprint()
    {
        cout << "WFS" << endl;
        for(int i=0;i<num;i++)
        {
            BFS(i);
            cout << endl;
        }
    }
};

int main()
{
    int n;
    int** l;
    cin >> n;
    l=new int*[n];
    for(int i=0;i<n;i++){
        l[i]=new int[n];
        for(int j=0;j<n;j++){
            cin >> l[i][j];
        }
    }
    LIST a(n,l);
    a.DFSprint();
    a.BFSprint();
    return 0;
}

​

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值