图的深度、广度优先探索(数据结构)

这篇具有很好参考价值的文章主要介绍了图的深度、广度优先探索(数据结构)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深度:

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

typedef struct ANode
{
    int adjver,len;
    struct ANode*next;
} ArcNode;

typedef struct VNode
{
    int data;
    ArcNode*firstarc;
} VertexNode;

typedef struct
{
    VertexNode vers[MAX+1];
    int vernum,arcnum;
} AdjList;

void Create(AdjList*AL);
void Deepth(AdjList AL,int v0,int v1);

int sign;
int visited[MAX];

int main()
{
    AdjList A;
    Create(&A);
    for(int i=1; i<=A.vernum; i++)
        visited[i]=0;
    int v0,v1;
    scanf("%d %d",&v0,&v1);
    Deepth(A,v0,v1);
    if(sign)
        printf("yes");
    else printf("no");
    return 0;
}

void Create(AdjList*AL)
{
    scanf("%d %d",&(AL->vernum),&(AL->arcnum));
    for(int i=1; i<=AL->vernum; i++)
        scanf("%d",&(AL->vers[i].data));
    for(int i=1; i<=AL->vernum; i++)
    {
        int v1,v2;
        scanf("%d %d",&v1,&v2);
        ArcNode*ins=(ArcNode*)malloc(sizeof(ArcNode));
        ins->adjver=v2;
        ins->next=AL->vers[v1].firstarc;
        AL->vers[v1].firstarc=ins;
    }
}

void Deepth(AdjList AL,int v0,int v1)
{
    visited[v0]=1;
    if(v0==v1)
    {
        sign=1;
        return;
    }
    ArcNode*p=AL.vers[v0].firstarc;
    for(; p!=NULL; p=p->next)
    {
        if(visited[p->adjver]==0)
            Deepth(AL,p->adjver,v1);
    }
}

广度:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct
{
    int data[MAX];
    int front,rear;//队头,队尾
}Queue;

typedef struct ArcNode
{
    int adjver;//弧指向的顶点
    struct ArcNode* nextarc;//下一条弧的指针
}ArcNode;

typedef struct VertexNode
{
    int data;//顶点数据
    ArcNode*firstarc;//该顶点的一条弧的指针
}VertexNode;

typedef struct
{
    VertexNode vertexs[MAX];//顶点数组
    int vernum,arcnum;//顶点总数,弧总数
}AdjList,*AList;

void CreateAdjList(AList *g);//创建邻接表
void BreadthSearch(AdjList g,int vi,int vj);//广度优先搜索

int visited[MAX]={0};//全局变量,标记是否查询过
Queue q;//队列,按顺序存储应该访问的顶点

int main()
{
    AList g;
    int vi,vj;//要查询的两个顶点
    q.rear=q.front=0;//队初始化
    CreateAdjList(&g);//创建邻接表
    scanf("%d %d",&vi,&vj);
    BreadthSearch(*g,vi,vj);//广度优先搜索
    if(visited[vj]==1)
        printf("yes");
    else printf("no");
    return 0;
}

/*创建邻接表
 */
void CreateAdjList(AList *g)
{
    int vn,an,v1,v2;//分别是顶点总数,弧总数, 弧的前后两个顶点
    (*g)=(AList)malloc(sizeof(AdjList));
    scanf("%d %d",&vn,&an);
    (*g)->arcnum=an;
    (*g)->vernum=vn;
    for(int i=0;i<vn;i++)
    {
        scanf("%d",&((*g)->vertexs[i].data));
    }
    for(int i=0;i<an;i++)
    {
        scanf("%d %d",&v1,&v2);//弧的前后两个顶点
        ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));//插入的弧结点
        p->adjver=v2;
        p->nextarc=(*g)->vertexs[v1].firstarc;
        (*g)->vertexs[v1].firstarc=p;//完成弧节点的插入
    }
}

/*广度优先搜索
 *vi:起始点
 *vj:终止点
 */
void BreadthSearch(AdjList g,int vi,int vj)
{
    if(q.front>q.rear)//如果队已经没有元素,则结束
        return;
    visited[vi]=0;
    if(vi==vj)//找到 vj ,结束
        return;
    ArcNode*search=(ArcNode*)malloc(sizeof(ArcNode));
    for(search=g.vertexs[vi].firstarc;search!=NULL;search=search->nextarc)//把 vi 顶点的所有邻接点遍历
    {
        int v=search->adjver;
        if(visited[v]==0)
        {
           visited[v]=1;
        q.data[q.rear++]=v;//把先访问的邻接点放在队中
        if(v==vj)//找到 vj ,结束
            return;
        }
    }
    BreadthSearch(g,q.data[q.front++],vj);//递归遍历
}

文章来源地址https://www.toymoban.com/news/detail-633185.html

到了这里,关于图的深度、广度优先探索(数据结构)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(50)
  • 【数据结构】图的创建和深度(DFS)广度(BFS)优先遍历

    图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图, V是图G中 顶点的集合 , E是图G中 边的集合 。 图分为 无向图 和 有向图 无向图: 若顶点Vi到Vj之间的边没有方向,则称这条边为无向边(Edge),用序偶对(Vi,Vj)表示。 有向图: 若从

    2024年02月05日
    浏览(59)
  • 【数据结构与算法】图的基本概念 | 邻接矩阵和邻接表 | 广度优先遍历和深度优先遍历

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E) ,其中: 顶点集合V = {x|x属于某

    2024年02月04日
    浏览(69)
  • 数据结构上机实验——图的实现(以无向邻接表为例)、图的深度优先搜索(DFS)、图的广度优先搜索(BFS)

      图采用邻接表存储结构,编程实现图的深度优先搜索和广度优先搜索算法。              2.1创建图 2.1.1定义图的顶点、边及类定义   我们定义一个 邻接表类(ALGraph) 。这里实现一些基础的数据结构。要注意结构体的嵌套。    Edge: 用于表示图中的边

    2024年02月04日
    浏览(52)
  • 数据结构与算法基础-学习-24-图的遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

    目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS(邻接矩阵实现) 2、DFS(邻接表实现) 3、BFS(邻接矩阵实现) 4、BFS(邻接表实现) 5、打印邻接矩阵遍历顺序  6、打印邻接表遍历顺序 八、遍历算法效率分析 1、DFS 2、BFS 九

    2024年02月03日
    浏览(72)
  • 数据结构实验6 :图的存储与遍历(邻接矩阵的深度优先遍历DFS和邻接表的广度优先遍历BFS)

    利用邻接矩阵存储无向图,并从0号顶点开始进行深度优先遍历。 输入第一行是两个整数n1 n2,其中n1表示顶点数(则顶点编号为0至n1-1),n2表示图中的边数。 之后有n2行输入,每行输入表示一条边,格式是“顶点1 顶点2”,把边插入图中。 例如: 4 4 0 1 1 3 0 3 0 2 先输出存储

    2024年02月09日
    浏览(63)
  • 【数据结构】图的广度优先遍历

    广度优先遍历,类似于树的层次遍历,又是熟悉的队列实现。首先将第一个顶点添加到队列中,然后讲该顶点的所有邻接顶点都加入队列中,再将该顶点输出。如此重复直到遍历完整个图。 Q:队列,用于存放顶点。 front,rear:队头和队尾指针,用于入队和出队。 p:工作指针,用

    2024年02月05日
    浏览(48)
  • 数据结构--5.3图的遍历(广度优先遍历)

    广度优先遍历:         广度优先遍历(BreadthFirstSearch),又称为广度优先搜索,简称BFS。 要实现对图的广度遍历,我们可以利用队列来实现。  (参考队列)(上述为结构)

    2024年02月10日
    浏览(47)
  • 【数据结构与算法】图的搜索——广度优先遍历、最小生成树

    邻接链表: 用字典实现.有向图的邻接链表的总长度等于图的边个数;无向图的邻接链表的总长度等于图的边个数的2倍. 邻接矩阵:用于最短路径算法. 该数据结构维护一个不相交动态集的集合,每个集合有一个代表,不关心谁做代表。 支持三种操作: MAKE_SET(x) FIND_SET(x) UNION(x,y

    2024年02月19日
    浏览(49)
  • 数据结构——图篇(邻接矩阵、邻接表、深度优先搜索、广度优先搜索)

    描述 图比树更为复杂,展现的是一种多对多的关系,图的结构是任意两个数据对象之间都可能存在某种特定的关系的数据结构 概念 顶点 : 基本介绍 顶点集合表示为V集合,要求图中顶点至少要有一个,即V集合不能为空集。通常使用|V|来表示顶点的个数,通常使用E(V)来表示

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包