数据结构实验五(图的遍历)

本文介绍了如何使用邻接矩阵和邻接表两种数据结构实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。通过C++代码示例,详细展示了从输入图信息到遍历过程的步骤,并给出了相应的遍历顺序。深度优先遍历类似迷宫探索,直至无法前进再回溯;广度优先遍历则像地毯式搜索,逐层扩展。代码中包括了两种遍历方法的实现,并提供了测试案例进行演示。
摘要由CSDN通过智能技术生成

题目描述:
分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历。
下面邻接矩阵和邻接表均以下图为例,其中已标注了正确的dfs,bfs顺序图和相关的表示法。
几句话明白深度与广度搜索:深度优先就像你被困在了迷宫里面,想要出去必须一路走到底,直到走不通了才回溯,重点是回溯。而广度优先就像你丢了眼镜,看不清的时候满地寻找,辐射范围大
上次实验四哈夫曼树全部完整代码此处
已经上传深搜和广搜的专训题目每一题都涉及2种解法,更加全方位地展现其中的不同。详情点击此处
在这里插入图片描述

邻接矩阵存储图
MGraph.cpp

#include <iostream>
#include <queue>


using namespace std;

typedef struct{
    int v[500];
    int e[500][500];
    int vsum,esum;
    bool visit[500];
}MGraph;

/*创建邻接矩阵*/
void Create(MGraph &g){
    cout<<"请输入图的顶点总数和边数"<<endl;
    cin>>g.vsum>>g.esum;
    cout<<"输入图中节点信息"<<endl;
    for(int i=0;i<g.vsum;i++){
        cin>>g.v[i];
    }
    for(int i=0;i<g.vsum;i++){
        g.visit[g.v[i]]=false;
        for(int j=0;j<g.vsum;j++){
            g.e[g.v[i]][g.v[j]]=-1;
        }
    }
    cout<<"输入图中各边的两个顶点和边长"<<endl;
    for(int i=0;i<g.esum;i++){
        int v1,v2,w;
        cin>>v1>>v2>>w;
        g.e[v1][v2]=w;
        g.e[v2][v1]=w;
    }
}

void dfs(MGraph &g,int start,string &str){
    str+=(start+48);//转换字符
    str+="->";
    g.visit[start]=true;
    for(int i=0;i<g.vsum;i++){
        int temp=g.v[i];
        if(g.visit[temp]==false&&g.e[start][temp]!=-1){
            dfs(g,temp,str);
        }
    }
}

void bfs(MGraph &g,int start,string &str){
    queue<int> q;
    q.push(start);
    g.visit[start]=true;
    while(!q.empty()){
        int top=q.front();
        q.pop();
        str+=(top+48);
        str+="->";
        for(int i=0;i<g.vsum;i++){
            int temp=g.v[i];
            if(g.e[top][temp]!=-1&&g.visit[temp]==false){
                q.push(temp);
                g.visit[temp]=true;
            }
        }
    }
}

void traver1(MGraph &g){
    for(int i=0;i<g.vsum;i++){
        g.visit[g.v[i]]=false;
    }
    cout<<"\n广度搜索遍历:"<<endl;
    string m="";
    bfs(g,1,m);
    m=m.substr(0,m.length()-2);
    cout<<m<<endl;
}

void traver2(MGraph &g){
    for(int i=0;i<g.vsum;i++){
        g.visit[g.v[i]]=false;
    }
    cout<<"深度搜索遍历:"<<endl;
    string m="";
    dfs(g,1,m);
    m=m.substr(0,m.length()-2);
    cout<<m<<endl;
}

int main(){
    MGraph g;
    Create(g);
    traver1(g);
    traver2(g);
}

结果示意图
在这里插入图片描述

邻接表存储图
AGraph.cpp

#include <iostream>
#include <queue>
#include <cstring>
#include <string>

using namespace std;

bool visit[500];

/*边结点*/
typedef struct ArcNode{
    int adv;
    struct ArcNode *nextArc;
    int  data;
}ArcNode;

typedef struct VNode{
    ArcNode *first;
    string  data;
}AdVlist;

/*邻接表*/
typedef struct ALGraph{
    AdVlist vts[500];
    int v,e;
}ALGraph;

int find(ALGraph &g,string  x){
    for(int i=0;i<g.v;i++){
        if(x==g.vts[i].data)
            return i;
    }
    return -1;
}

void Create(ALGraph &g){
    string  v1,v2;
    cout<<"输入图的顶点数和边数"<<endl;
    cin>>g.v>>g.e;
    cout<<"输入图中结点信息"<<endl;
    for(int i=0;i<g.v;i++){
        cin>>g.vts[i].data;
        g.vts[i].first=NULL;
    }
    cout<<"输入图中两个顶点(起点和终点)"<<endl;
    for(int i=0;i<g.e;i++){
        cin>>v1>>v2;
        int j,k;
        j=find(g,v1);
        k=find(g,v2);
        ArcNode *p1=new ArcNode;
        ArcNode *p2=new ArcNode;
        p1->adv=k;
        p1->nextArc=g.vts[j].first;
        g.vts[j].first=p1;
        p2->adv=j;
        p2->nextArc=g.vts[k].first;
        g.vts[k].first=p2;
    }
}

void dfs(ALGraph &g,int n){
    cout<<g.vts[n].data;
    visit[n]=false;
    ArcNode *p=g.vts[n].first;
    while(p){
        if(visit[p->adv]){
            cout<<"->";
            dfs(g,p->adv);
        }
        p=p->nextArc;
    }
}

void bfs(ALGraph &g,int n){
    queue<int> q;
    q.push(n);
    while(!q.empty()){
        if(q.front()!=0) cout<<"->";
        cout<<g.vts[q.front()].data;
        visit[q.front()]=true;
        ArcNode *p=g.vts[q.front()].first;
        while(p){
            if(!visit[p->adv]){
                visit[p->adv]=true;
                q.push(p->adv);
            }
            p=p->nextArc;
        }
        q.pop();
    }
}


int main(){
    ALGraph g;
    Create(g);
    memset(visit,true,sizeof(visit));
    cout<<"深度优先遍历:"<<endl;
    dfs(g,0);
    cout<<"\n广度优先遍历:"<<endl;
    bfs(g,0);
    return 0;
}

结果运行图
注意看我上述图的说明,注意指针的位置,不是根据矩阵法的dfs/bfs,而是看我写的邻接表的图。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值