c语言实现:由于受疫情影响,小明一直居家不敢外出。听说最近疫情好转,他正准 备外出。此时,小明正看着全国旅游地图发呆,地图中一共有n(<=10) 个城市,所有城市被编码成0,1,2..,n-1。地图实在是太多线路,一共有 e(<=10)条,每条线路分别从一个城市出发,达到另外一个城市。主要 注意的是,所有线路都是双向的。目前小明比较关心的是从所在城市出 发,达到指定的旅游城市至少要经过多少个城市。你能帮帮他吗? 输入: 第1行包括两个整数,n和e。 第2行包括2*e个整数表示e条线路线路,其中每条线路由两个整数ai和 b i组成,分别表示线路的起点和终点。 第3行包括一个整数q,表示小明想查询的次数 第4行包括2*q个整数表示q次查询,其中每次查询由两个整数ci和di 组成,分别表示小明期望的出发城市和达到城市。 0<=a i,b i,c i,d i<n输出: q行,1行对于1次查询,如果能达到,则输出至少要经过的城市数量 (不包括出发城市,包括达到城市),,否则输出"-1"
时间: 2023-02-05 16:36:03 浏览: 73
基于C语言实现的疫情防疫智能小车消毒机器人设计源码
这是一个典型的图论问题。我们可以使用邻接表来存储图中的边信息,然后使用广度优先搜索(BFS)来寻找最短路径。
下面是一个使用邻接表存储图信息并使用 BFS 求解最短路径的 C 语言代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 10
#define MAX_EDGES 10
#define MAX_QUERIES 10
typedef struct Edge {
int to;
struct Edge *next;
} Edge;
typedef struct Node {
Edge *head;
} Node;
Node graph[MAX_NODES];
int distances[MAX_NODES];
void add_edge(int from, int to) {
// 为了简单起见,这里没有使用尾插法,而是直接在头插入
Edge *edge = malloc(sizeof(Edge));
edge->to = to;
edge->next = graph[from].head;
graph[from].head = edge;
}
int bfs(int start, int end) {
// 初始化距离数组
for (int i = 0; i < MAX_NODES; i++) {
distances[i] = -1;
}
// 初始化队列
int queue[MAX_NODES] = {start};
int head = 0;
int tail = 1;
// 初始化起点的距离为 0
distances[start] = 0;
while (head < tail) {
// 取出队列头
int curr = queue[head++];
// 枚举当前节点的所有出边
for (Edge *edge = graph[curr].head; edge != NULL; edge = edge->next) {
int to = edge->to;
// 如果目标节点没有被访问过,就将其加入队列中
if (distances[to] == -1) {
distances[to] = distances[curr] + 1;
queue[tail++] = to;
}
}
}
// 返回终点的
阅读全文