用c语言写出以下问题:有一个n 个点 m 条边的无向图,请求出从 s 到 t 的最短路长度
时间: 2024-02-25 07:58:21 浏览: 69
以下是使用 Dijkstra 算法求解最短路的 C 代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1005
#define INF 0x3f3f3f3f
int n, m, s, t;
int adj[MAXN][MAXN];
int dist[MAXN];
int vis[MAXN];
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(vis, 0, sizeof(vis));
dist[s] = 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];
}
}
if (u == 0) break;
vis[u] = 1;
for (int v = 1; v <= n; ++v) {
if (adj[u][v] > 0 && !vis[v] && dist[v] > dist[u] + adj[u][v]) {
dist[v] = dist[u] + adj[u][v];
}
}
}
}
int main() {
scanf("%d %d %d %d", &n, &m, &s, &t);
memset(adj, 0, sizeof(adj));
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
adj[u][v] = adj[v][u] = w;
}
dijkstra(s);
printf("%d\n", dist[t]);
return 0;
}
```
其中 adj[][] 存储了邻接矩阵,dist[] 存储了起点到每个点的最短距离,vis[] 表示该点是否已经被访问过。在 dijkstra 函数中,先将起点 s 的距离设为 0,其余点的距离设为正无穷。然后依次将未访问过的点中距离最小的点 u 加入 visited 集合,并更新与 u 相邻的点的距离。最终返回 dist[t],即为起点到 t 的最短路长度。
阅读全文