深入探索图算法:用C语言实现BFS和DFS

深入探索图算法:用C语言实现BFS和DFS

图算法是计算机科学中一个重要且有趣的领域,它们在解决许多现实世界的问题时发挥着关键作用。本篇博客将介绍两种常见的图算法:广度优先搜索(BFS)和深度优先搜索(DFS),并提供在C语言中的实现示例。

广度优先搜索(BFS)

广度优先搜索是一种用于图遍历的算法,它从起始节点开始逐层遍历图的节点,直到找到目标节点或遍历完整个图。下面是BFS算法的C语言实现示例:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MAX_VERTICES 100

typedef struct {
    int data[MAX_VERTICES];
    int front, rear;
} Queue;

void initQueue(Queue *q) {
    q->front = q->rear = -1;
}

bool isEmpty(Queue *q) {
    return q->front == -1;
}

void enqueue(Queue *q, int value) {
    if (isEmpty(q)) {
        q->front = q->rear = 0;
    } else {
        q->rear++;
    }
    q->data[q->rear] = value;
}

int dequeue(Queue *q) {
    int value = q->data[q->front];
    if (q->front == q->rear) {
        q->front = q->rear = -1;
    } else {
        q->front++;
    }
    return value;
}

void BFS(int graph[MAX_VERTICES][MAX_VERTICES], int vertices, int start) {
    bool visited[MAX_VERTICES] = { false };
    Queue q;
    initQueue(&q);

    visited[start] = true;
    enqueue(&q, start);

    while (!isEmpty(&q)) {
        int vertex = dequeue(&q);
        printf("%d ", vertex);

        for (int i = 0; i < vertices; i++) {
            if (graph[vertex][i] && !visited[i]) {
                visited[i] = true;
                enqueue(&q, i);
            }
        }
    }
}

int main() {
    int vertices, edges, start;
    printf("Enter the number of vertices: ");
    scanf("%d", &vertices);
    printf("Enter the number of edges: ");
    scanf("%d", &edges);

    int graph[MAX_VERTICES][MAX_VERTICES] = { 0 };

    printf("Enter the edges (format: u v):\n");
    for (int i = 0; i < edges; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        graph[u][v] = graph[v][u] = 1;
    }

    printf("Enter the starting vertex: ");
    scanf("%d", &start);

    printf("BFS traversal starting from vertex %d: ", start);
    BFS(graph, vertices, start);

    return 0;
}

深度优先搜索(DFS)

深度优先搜索是另一种图遍历算法,它沿着图的深度尽可能远地探索节点,然后回溯到之前的节点继续探索。下面是DFS算法的C语言实现示例:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

#define MAX_VERTICES 100

typedef struct {
    int data[MAX_VERTICES];
    int top;
} Stack;

void initStack(Stack *s) {
    s->top = -1;
}

bool isEmpty(Stack *s) {
    return s->top == -1;
}

void push(Stack *s, int value) {
    s->data[++s->top] = value;
}

int pop(Stack *s) {
    return s->data[s->top--];
}

void DFS(int graph[MAX_VERTICES][MAX_VERTICES], int vertices, int vertex, bool visited[MAX_VERTICES]) {
    printf("%d ", vertex);
    visited[vertex] = true;

    for (int i = 0; i < vertices; i++) {
        if (graph[vertex][i] && !visited[i]) {
            DFS(graph, vertices, i, visited);
        }
    }
}

int main() {
    int vertices, edges, start;
    printf("Enter the number of vertices: ");
    scanf("%d", &vertices);
    printf("Enter the number of edges: ");
    scanf("%d", &edges);

    int graph[MAX_VERTICES][MAX_VERTICES] = { 0 };

    printf("Enter the edges (format: u v):\n");
    for (int i = 0; i < edges; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        graph[u][v] = graph[v][u] = 1;
    }

    printf("Enter the starting vertex: ");
    scanf("%d", &start);

    bool visited[MAX_VERTICES] = { false };
    printf("DFS traversal starting from vertex %d: ", start);
    DFS(graph, vertices, start, visited);

    return 0;
}

总结

本篇博客介绍了图算法中的两个重要概念:广度优先搜索(BFS)和深度优先搜索(DFS)。通过C语言实现的示例代码,您可以更好地理解这两种算法的工作原理和用途。图算法在社交网络分析、路径规划、游戏开发等领域具有广泛的应用,深入理解这些算法将有助于您解决各种实际问题。

希望本文对您学习图算法和C语言编程有所帮助!如果您有任何问题或建议,请随时在评论区留言。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
BFSDFS是两种常用的算法。引用中的代码是一个DFS的C++实现,而引用中的代码是一个BFS的C++实现DFS深度优先搜索)算法是一种递归的搜索方法,它从的起始节点开始,不断地向下探索邻接的未访问节点,直到遍历完所有的节点或者满足某个条件停止。在DFS算法中,我们使用一个栈来记录已经访问过的节点,并递归地调用DFS函数来继续探索下一个节点。DFS算法在搜索全部解的问题上非常适用,但是不一定能够找到最短路径。 BFS(广度优先搜索)算法是一种逐层扩展的搜索方法,它从的起始节点开始,先访问起始节点的所有邻接节点,然后再访问邻接节点的邻接节点,以此类推,直到遍历完所有的节点或者满足某个条件停止。在BFS算法中,我们使用一个队列来记录已经访问过的节点,并不断地将邻接节点加入队列中以便后续访问。BFS算法可以找到最短路径,因为它总是先访问离起始节点最近的节点。 所以,如果你需要搜索最短路径或者最优解的解决方案,BFS算法更适合。而如果你只是需要搜索全部的解,DFS算法更合适。两种算法在空间上也有一些差异,DFS不需要额外的空间来保存搜索过程中的状态,而BFS需要一个队列来记录已经访问过的节点。 综上所述,以上是BFSDFS算法C语言实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [bfsdfs算法](https://blog.csdn.net/qq_57968062/article/details/120711688)[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_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不一样的老墨

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值