请用C语言完成代码
时间: 2024-02-28 14:54:49 浏览: 15
以下是基于 Dijkstra 算法实现的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1005
#define MAXM 100005
#define INF 0x3f3f3f3f
struct Edge {
int v, w, nxt;
} edge[MAXM], e[MAXM];
int head[MAXN], hd[MAXN], dist[MAXN], vis[MAXN];
int cnt, ecnt, n, m;
void addEdge(int u, int v, int w) {
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
void add(int u, int v, int w) {
e[++ecnt].v = v;
e[ecnt].w = w;
e[ecnt].nxt = hd[u];
hd[u] = ecnt;
}
void Dijkstra() {
memset(dist, INF, sizeof(dist));
memset(vis, 0, sizeof(vis));
dist[1] = 0;
for (int i = 1; i < n; i++) {
int u = 0, minDist = INF;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dist[j] < minDist) {
u = j;
minDist = dist[j];
}
}
vis[u] = 1;
for (int j = head[u]; j; j = edge[j].nxt) {
int v = edge[j].v, w = edge[j].w;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
}
}
for (int j = hd[u]; j; j = e[j].nxt) {
int v = e[j].v, w = e[j].w;
int flag = 0;
for (int k = hd[v]; k; k = e[k].nxt) {
if (vis[e[k].v]) {
flag = 1;
break;
}
}
if (!flag) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
}
for (int i = 1; i <= n; i++) {
int k;
scanf("%d", &k);
while (k--) {
int x;
scanf("%d", &x);
add(i, x, 0);
add(x, i, 0);
}
}
for (int i = 1; i <= n; i++) {
add(0, i, 0);
add(i, 0, 0);
}
Dijkstra();
printf("%d\n", dist[n]);
return 0;
}
```
其中,`addEdge` 函数用于添加原图的边,`add` 函数用于添加城市之间的边,`Dijkstra` 函数用于求解最短路径。在 `add` 函数中,如果城市 i 有护盾发生器在城市 j,则添加一条从 i 到 j 的边,边权为 0。在 `Dijkstra` 函数中,如果某个城市的所有护盾发生器都还没有被摧毁,则该城市不可达,因此不将该城市与其他城市相连。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)