图的遍历 代码 深搜 广搜代码

目录

深度优先搜索

测试一下

广度优先搜索

测试一下


深度优先搜索


/*
创建无向图并深度优先搜索
*/

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
typedef struct ArcCell {
    char vexnum[MAXN];         //顶点
    int arcnum[MAXN][MAXN];    //弧
    int n, e;                  //顶点数, 弧数
}Graph;
int Visit[MAXN] = { 0 };         //定义Visit来判断顶点是否被访问,并初始化 



void CreateGraph(Graph* G) {        //创建图 ,此处注意&G 
    int s, t;
    scanf_s("%d %d", &G->n, &G->e);
    getchar();
    for (int i = 0; i < G->n; i++) {
        scanf_s("%c", &G->vexnum[i],1);
        getchar();
    }
    for (int i = 0; i < G->n; i++) {              //初始化数据 
        for (int j = 0; j < G->n; j++) {
            G->arcnum[i][j] = 0;
        }
    }
    for (int i = 0; i < G->e; i++) {              //创建图的邻接矩阵
        scanf_s("%d %d", &s, &t);
        G->arcnum[s][t] = 1;
        G->arcnum[t][s] = 1;
    }
}

//int Visit[MAXN] = { 0 };
//开始搜索   找一个开始结点
//但是一个图,没有所谓的第一个结点
//开始结点是人定义的
//需要遍历的图G   遍历的起始结点从i开始
//标记结点
//1.遍历未被标记的结点
//2.如果遍历到某一个邻接点已被标记  我要继续找和我相邻的另外一个结点
void DFSTraverse(Graph G, int i) {//找邻接点
    printf("%c", G.vexnum[i]);
    for (int j = 0; j < G.n; j++) {
        if (G.arcnum[i][j] && !Visit[j]) {
            Visit[j] = 1;
            DFSTraverse(G, j);
        }
    }


}
void DFS(Graph G) {//遍历未被标记的结点   
    for (int i = 0; i < G.n; i++)//对整个图的结点进行深搜
    {
        if (!Visit[i]) {
            Visit[i] = 1;
            DFSTraverse(G, i);
        }


    }


}


int main()
{
    Graph G;
    CreateGraph(&G);
    DFS(G);

}

测试一下

 

广度优先搜索

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERtEX_NUM 20                   //顶点的最大个数
#define VRType int                          //表示顶点之间的关系的变量类型
#define InfoType char                       //存储弧或者边额外信息的指针变量类型
#define VertexType int                      //图中顶点的数据类型
//typedef enum { false, true }bool;           //定义bool型常量
bool visited[MAX_VERtEX_NUM];               //设置全局数组,记录标记顶点是否被访问过
typedef struct Queue {
    VertexType data;
    struct Queue* next;
}Queue;
typedef struct {
    VRType adj;                             //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。
    InfoType* info;                        //弧或边额外含有的信息指针
}ArcCell, AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];
typedef struct {
    VertexType vexs[MAX_VERtEX_NUM];        //存储图中顶点数据
    AdjMatrix arcs;                         //二维数组,记录顶点之间的关系
    int vexnum, arcnum;                      //记录图的顶点数和弧(边)数
}MGraph;

int LocateVex(MGraph* G, int v);


//构造无向图
void CreateDN(MGraph* G) {
    scanf_s("%d,%d", &(G->vexnum), &(G->arcnum));
    for (int i = 0; i < G->vexnum; i++) {
        scanf_s("%d", &(G->vexs[i]));
    }
    for (int i = 0; i < G->vexnum; i++) {
        for (int j = 0; j < G->vexnum; j++) {
            G->arcs[i][j].adj = 0;
            G->arcs[i][j].info = NULL;
        }
    }
    for (int i = 0; i < G->arcnum; i++) {
        int v1, v2;
        scanf_s("%d,%d", &v1, &v2);
        int n = LocateVex(G, v1);
        int m = LocateVex(G, v2);
        if (m == -1 || n == -1) {
            printf("no this vertex\n");
            return;
        }
        G->arcs[n][m].adj = 1;
        G->arcs[m][n].adj = 1;//无向图的二阶矩阵沿主对角线对称
    }
}



//操作顶点的函数
void visitVex(MGraph G, int v) {
    printf("%d ", G.vexs[v]);
}
//初始化队列
void InitQueue(Queue** Q) {
    (*Q) = (Queue*)malloc(sizeof(Queue));
    (*Q)->next = NULL;
}
//顶点元素v进队列
void EnQueue(Queue** Q, VertexType v) {
    Queue* element = (Queue*)malloc(sizeof(Queue));
    element->data = v;
    element->next = NULL;
    Queue* temp = (*Q);
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = element;
}
//队头元素出队列
void DeQueue(Queue** Q, int* u) {
    (*u) = (*Q)->next->data;
    (*Q)->next = (*Q)->next->next;
}
//判断队列是否为空
bool QueueEmpty(Queue* Q) {
    if (Q->next == NULL) {
        return true;
    }
    return false;
}

int LocateVex(MGraph* G, int v) {
    for (int i = 0; i < G->vexnum; i++) {
        if (G->vexs[i] == v) {
            return i;
        }
    }
    return -1;
}

int FirstAdjVex(MGraph G, int v) {
    for (int i = 0; i < G.vexnum; i++) {
        if (G.arcs[v][i].adj) {
            return i;
        }
    }
    return -1;
}

int NextAdjVex(MGraph G,int v,int w) {
    for (int i = w+1; i < G.vexnum; i++)
    {
        if (G.arcs[v][i].adj) {
            return i;
        }
    }
    return -1;
}


void BFSTraverse(MGraph G) {
    for (int i = 0; i < G.vexnum; i++)
    {
        visited[i] = 0;
    }
    Queue* Q;
    InitQueue(&Q);
    for (int i = 0; i < G.vexnum; i++)
    {
        if (!visited[i]) {
            visited[i] = 1;
            printf("%d", G.vexs[i]);
            EnQueue(&Q, G.vexs[i]);
            while (!QueueEmpty(Q)) {
                int u;//出队元素的值
                DeQueue(&Q,&u);
                //先定位下标
                u = LocateVex(&G, u);
                //从第一个和下标u有关的顶点位置开始,到下一个跟我有关系的点
                for (int w = FirstAdjVex(G,u); w >= 0; w=NextAdjVex(G,u,w))
                {
                    if (!visited[w]) {
                        visited[w] = 1;
                        printf("%d", G.vexs[w]);
                        EnQueue(&Q, G.vexs[w]);
                    }

                }

            }
        }
    }

}

int main() {
    MGraph G;
    CreateDN(&G);
    BFSTraverse(G);
    return 0;
}


测试一下

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在提供的AC代码中,有关于深度优先索(DFS)和广度优先索(BFS)的实现方法。 在第一段代码中,是一个关于深度优先索的实现。该代码通过递归的方式来实现深度优先索。它使用了一个路径数组和一个标记数组来记录路径和访问状态。在每一次递归时,根据条件进行索,并在索完成后进行回溯操作。最终输出所有路径的结果。 在第二段代码中,是一个关于广度优先索的实现。该代码使用了一个队列来进行广度优先索。它使用了一个二维数组来表示的状态和一个二维数组来记录访问状态。在索时,将起始点入队并标记为已访问,然后通过循环遍历队列中的元素,并根据条件进行索,并将符合条件的点入队并标记为已访问。最终返回从入口到出口的路径长度。 因此,根据提供的AC代码,可以实现深度优先索和广度优先算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【C++】数据结构之深搜+广 经典题型](https://blog.csdn.net/weixin_64967734/article/details/124994451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天写bug的屑闲鱼

请我杯饮料吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值