最短路n个顶点m条边的无向图计算源点s到终点t的最短路 输入格式:第一行,四个整数n,m,s,t,由空格隔开;随后m行,每行3个正整数x,y,c,表示边(x,y)的长度为c。输出一个整数,表示s到t的最短路径长度。 用c语言代码编写
时间: 2024-03-03 22:47:32 浏览: 254
以下是使用Dijkstra算法求解最短路径的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_N 1000
#define MAX_M 10000
int n, m, s, t;
int graph[MAX_N][MAX_N];
int dist[MAX_N];
int visited[MAX_N];
void dijkstra()
{
// 初始化距离数组
for (int i = 0; i < n; i++)
dist[i] = INT_MAX;
dist[s] = 0;
// 循环n次,每次找到一个距离最短的点
for (int i = 0; i < n; i++)
{
int min_dist = INT_MAX;
int min_index = -1;
for (int j = 0; j < n; j++)
{
if (!visited[j] && dist[j] < min_dist)
{
min_dist = dist[j];
min_index = j;
}
}
// 标记该点为已访问
visited[min_index] = 1;
// 更新与该点相邻的点的距离
for (int j = 0; j < n; j++)
{
if (graph[min_index][j] != -1 && !visited[j])
{
int new_dist = dist[min_index] + graph[min_index][j];
if (new_dist < dist[j])
dist[j] = new_dist;
}
}
}
}
int main()
{
// 读入图
scanf("%d%d%d%d", &n, &m, &s, &t);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
graph[i][j] = -1;
}
}
for (int i = 0; i < m; i++)
{
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
graph[x][y] = c;
graph[y][x] = c; // 无向图需要双向记录
}
// 计算最短路径
dijkstra();
// 输出结果
printf("%d\n", dist[t]);
return 0;
}
```
该代码使用邻接矩阵存储图,使用Dijkstra算法求解最短路径。在每次循环中,找到距离源点最近的未访问过的点,并标记为已访问。然后更新与该点相邻的未访问过的点的距离。
阅读全文