鱼C论坛

 找回密码
 立即注册
查看: 2568|回复: 4

[已解决]C语言bfs寻找最短路径

[复制链接]
发表于 2023-4-18 17:17:16 | 显示全部楼层
以下是一个基本的C语言实现,使用广度优先搜索(BFS)来找到并显示无向图中两个顶点之间的最短路径。这个实现假定您已经使用了一个邻接表来表示图。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>

  4. #define MAX_NODES 100

  5. typedef struct Queue {
  6.     int items[MAX_NODES];
  7.     int front;
  8.     int rear;
  9. } Queue;

  10. Queue* createQueue();
  11. void enqueue(Queue* q, int value);
  12. int dequeue(Queue* q);
  13. int isEmpty(Queue* q);

  14. void bfs(int start, int target, int num_nodes, int adj[][num_nodes], int path[]);

  15. int main() {
  16.     int num_nodes, num_edges;
  17.     printf("Enter the number of nodes and edges: ");
  18.     scanf("%d%d", &num_nodes, &num_edges);

  19.     int adj[num_nodes][num_nodes];
  20.     for (int i = 0; i < num_nodes; i++) {
  21.         for (int j = 0; j < num_nodes; j++) {
  22.             adj[i][j] = 0;
  23.         }
  24.     }

  25.     printf("Enter the edges:\n");
  26.     for (int i = 0; i < num_edges; i++) {
  27.         int u, v;
  28.         scanf("%d%d", &u, &v);
  29.         adj[u][v] = adj[v][u] = 1;
  30.     }

  31.     int start, target;
  32.     printf("Enter the starting and target nodes: ");
  33.     scanf("%d%d", &start, &target);

  34.     int path[MAX_NODES];
  35.     for (int i = 0; i < MAX_NODES; i++) {
  36.         path[i] = -1;
  37.     }

  38.     bfs(start, target, num_nodes, adj, path);

  39.     printf("Shortest Path: ");
  40.     if (path[target] != -1) {
  41.         int node = target;
  42.         while (node != start) {
  43.             printf("%d <- ", node);
  44.             node = path[node];
  45.         }
  46.         printf("%d\n", start);
  47.     } else {
  48.         printf("No path found.\n");
  49.     }

  50.     return 0;
  51. }

  52. Queue* createQueue() {
  53.     Queue* q = (Queue*)malloc(sizeof(Queue));
  54.     q->front = -1;
  55.     q->rear = -1;
  56.     return q;
  57. }

  58. void enqueue(Queue* q, int value) {
  59.     if (q->rear == MAX_NODES - 1)
  60.         return;
  61.     else {
  62.         if (q->front == -1)
  63.             q->front = 0;
  64.         q->rear++;
  65.         q->items[q->rear] = value;
  66.     }
  67. }

  68. int dequeue(Queue* q) {
  69.     int item;
  70.     if (isEmpty(q)) {
  71.         item = -1;
  72.     } else {
  73.         item = q->items[q->front];
  74.         q->front++;
  75.         if (q->front > q->rear) {
  76.             q->front = q->rear = -1;
  77.         }
  78.     }
  79.     return item;
  80. }

  81. int isEmpty(Queue* q) {
  82.     return q->rear == -1;
  83. }

  84. void bfs(int start, int target, int num_nodes, int adj[][num_nodes], int path[]) {
  85.     Queue* q = createQueue();
  86.     bool visited[num_nodes];

  87.     for (int i = 0; i < num_nodes; i++) {
  88.         visited[i] = false;
  89.     }

  90.     visited[start] = true;
  91.     enqueue(q, start);

  92.     while (!isEmpty(q)) {
  93.         int current = dequeue(q);

  94.         for (int i = 0; i < num_nodes; i++) {
  95.             if (adj[current][i] && !visited[i]) {
  96.                 visited[i] = true;
  97.                 enqueue(q, i);
  98.                 path[i] = current;
  99.                 if (i == target) {
  100.                     break;
  101.                 }
  102.             }
  103.         }
  104.     }
  105.     free(q);
  106. }
复制代码



这个程序首先读取节点和边的数量,并初始化一个邻接矩阵。然后,它从用户处获取边和起始节点、目标节点的信息。最后,它使用BFS算法找到最短路径,并将其打印出来。

请注意,此实现仅适用于无向图,并且不支持带有权重的边。对于有向图和带权重的边的图,请考虑使用其他算法,如Dijkstra算法。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-26 05:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表