|
发表于 2023-4-18 17:17:16
|
显示全部楼层
以下是一个基本的C语言实现,使用广度优先搜索(BFS)来找到并显示无向图中两个顶点之间的最短路径。这个实现假定您已经使用了一个邻接表来表示图。
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdbool.h>
- #define MAX_NODES 100
- typedef struct Queue {
- int items[MAX_NODES];
- int front;
- int rear;
- } Queue;
- Queue* createQueue();
- void enqueue(Queue* q, int value);
- int dequeue(Queue* q);
- int isEmpty(Queue* q);
- void bfs(int start, int target, int num_nodes, int adj[][num_nodes], int path[]);
- int main() {
- int num_nodes, num_edges;
- printf("Enter the number of nodes and edges: ");
- scanf("%d%d", &num_nodes, &num_edges);
- int adj[num_nodes][num_nodes];
- for (int i = 0; i < num_nodes; i++) {
- for (int j = 0; j < num_nodes; j++) {
- adj[i][j] = 0;
- }
- }
- printf("Enter the edges:\n");
- for (int i = 0; i < num_edges; i++) {
- int u, v;
- scanf("%d%d", &u, &v);
- adj[u][v] = adj[v][u] = 1;
- }
- int start, target;
- printf("Enter the starting and target nodes: ");
- scanf("%d%d", &start, &target);
- int path[MAX_NODES];
- for (int i = 0; i < MAX_NODES; i++) {
- path[i] = -1;
- }
- bfs(start, target, num_nodes, adj, path);
- printf("Shortest Path: ");
- if (path[target] != -1) {
- int node = target;
- while (node != start) {
- printf("%d <- ", node);
- node = path[node];
- }
- printf("%d\n", start);
- } else {
- printf("No path found.\n");
- }
- return 0;
- }
- Queue* createQueue() {
- Queue* q = (Queue*)malloc(sizeof(Queue));
- q->front = -1;
- q->rear = -1;
- return q;
- }
- void enqueue(Queue* q, int value) {
- if (q->rear == MAX_NODES - 1)
- return;
- else {
- if (q->front == -1)
- q->front = 0;
- q->rear++;
- q->items[q->rear] = value;
- }
- }
- int dequeue(Queue* q) {
- int item;
- if (isEmpty(q)) {
- item = -1;
- } else {
- item = q->items[q->front];
- q->front++;
- if (q->front > q->rear) {
- q->front = q->rear = -1;
- }
- }
- return item;
- }
- int isEmpty(Queue* q) {
- return q->rear == -1;
- }
- void bfs(int start, int target, int num_nodes, int adj[][num_nodes], int path[]) {
- Queue* q = createQueue();
- bool visited[num_nodes];
- for (int i = 0; i < num_nodes; i++) {
- visited[i] = false;
- }
- visited[start] = true;
- enqueue(q, start);
- while (!isEmpty(q)) {
- int current = dequeue(q);
- for (int i = 0; i < num_nodes; i++) {
- if (adj[current][i] && !visited[i]) {
- visited[i] = true;
- enqueue(q, i);
- path[i] = current;
- if (i == target) {
- break;
- }
- }
- }
- }
- free(q);
- }
复制代码
这个程序首先读取节点和边的数量,并初始化一个邻接矩阵。然后,它从用户处获取边和起始节点、目标节点的信息。最后,它使用BFS算法找到最短路径,并将其打印出来。
请注意,此实现仅适用于无向图,并且不支持带有权重的边。对于有向图和带权重的边的图,请考虑使用其他算法,如Dijkstra算法。
|
|