用C++代码写一个多源bfs的模板
时间: 2023-05-15 19:07:20 浏览: 125
以下是一个多源BFS的模板,使用C语言编写:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 1000
#define MAX_M 10000
typedef struct {
int to, next;
} Edge;
int head[MAX_N], edge_cnt = 0;
Edge edges[MAX_M];
int dist[MAX_N], que[MAX_N], vis[MAX_N];
int n, m, s[MAX_N], k;
void add_edge(int u, int v) {
edges[++edge_cnt].to = v;
edges[edge_cnt].next = head[u];
head[u] = edge_cnt;
}
void bfs() {
int l = 0, r = -1;
for (int i = 1; i <= k; i++) {
que[++r] = s[i];
vis[s[i]] = true;
dist[s[i]] = 0;
}
while (l <= r) {
int u = que[l++];
for (int i = head[u]; i; i = edges[i].next) {
int v = edges[i].to;
if (!vis[v]) {
vis[v] = true;
dist[v] = dist[u] + 1;
que[++r] = v;
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add_edge(u, v);
add_edge(v, u);
}
for (int i = 1; i <= k; i++) {
scanf("%d", &s[i]);
}
bfs();
for (int i = 1; i <= n; i++) {
printf("%d ", dist[i]);
}
printf("\n");
return 0;
}
```
这个模板实现了多源BFS,可以处理多个起点到所有点的最短路问题。输入格式为:
```
n m k
u1 v1
u2 v2
...
um vm
s1 s2 ... sk
```
其中n表示点数,m表示边数,k表示起点数,接下来m行表示边的信息,最后一行表示k个起点。输出格式为每个点到起点的最短距离。
阅读全文