在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。 在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。 可将迪杰斯特拉算法描述如下: 在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。 Input 输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。 以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。 Output 只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。 请注意行尾输出换行。 Sample Input 4 1 0 3 0 1 0 0 4 0 2 0 0 0 0 0 1 0 Sample Output 6 4 7 上述问题用C语言和数据结构写代码如何写
时间: 2024-02-13 08:01:10 浏览: 110
以下是使用C语言和数据结构实现迪杰斯特拉算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 50
int minDistance(int dist[], int visited[], int n) {
int min = INT_MAX, min_index;
for (int v = 0; v < n; v++) {
if (visited[v] == 0 && dist[v] <= min) {
min = dist[v];
min_index = v;
}
}
return min_index;
}
void dijkstra(int graph[MAX_VERTICES][MAX_VERTICES], int src, int n) {
int dist[MAX_VERTICES];
int visited[MAX_VERTICES];
for (int i = 0; i < n; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
dist[src] = 0;
for (int count = 0; count < n - 1; count++) {
int u = minDistance(dist, visited, n);
visited[u] = 1;
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
for (int i = 0; i < n; i++) {
if (i != src) {
if (dist[i] == INT_MAX) {
printf("-1\n");
} else {
printf("%d\n", dist[i]);
}
}
}
}
int main() {
int n, s, graph[MAX_VERTICES][MAX_VERTICES];
scanf("%d %d", &n, &s);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}
dijkstra(graph, s - 1, n);
return 0;
}
```
首先,在代码中我们定义了一个`minDistance`函数,用于查找距离数组`dist`中未访问的顶点中距离最小的顶点。接着,我们定义`dijkstra`函数来实现迪杰斯特拉算法。在该函数中,我们初始化距离数组`dist`和访问数组`visited`,将源点`src`的距离设为0。然后,我们对每个未访问的顶点进行迭代,更新距离数组`dist`。最后,我们输出源点到其它每一个顶点的最短路径长度。
在`main`函数中,我们首先读入输入数据,然后调用`dijkstra`函数来解决问题。需要注意的是,我们将源点的编号减1,因为输入的顶点编号从1开始,而在代码中数组的下标从0开始。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.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)
![txt](https://img-home.csdnimg.cn/images/20241231045021.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)