用C语言实现基于dijsktra算法的最短路径求解
时间: 2023-12-01 10:04:34 浏览: 111
好的,下面我给你提供一个基于Dijkstra算法的最短路径求解的C语言实现。
首先,我们需要定义一个邻接矩阵来存储图的信息,以及一个数组来存储每个节点到起点的距离和是否已经访问过的标记。具体代码如下:
```c
#define INF 0x3f3f3f3f //定义正无穷
int graph[MAX][MAX]; //邻接矩阵,MAX为最大节点数
int dist[MAX]; //存储每个节点到起点的距离
bool visited[MAX]; //标记节点是否已经被访问过
```
接下来,我们需要实现Dijkstra算法。其基本思路是从起点开始,每次找到距离起点最近的一个节点,并将该节点标记为已访问,然后更新该节点相邻节点的距离,直到所有节点都被访问过为止。具体实现如下:
```c
void Dijkstra(int start, int n) //start为起点,n为节点数
{
memset(dist, INF, sizeof(dist)); //初始化距离为正无穷
memset(visited, false, sizeof(visited)); //初始化所有节点均未访问
dist[start] = 0; //起点到自己的距离为0
for (int i = 0; i < n; i++) {
int u = -1; //记录距离起点最近的节点
int minDist = INF;
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < minDist) { //如果节点未访问过且距离更近,则更新u和minDist
u = j;
minDist = dist[j];
}
}
if (u == -1) return; //如果没有找到未访问过的节点,则退出循环
visited[u] = true; //标记节点u为已访问
for (int v = 0; v < n; v++) { //更新与节点u相邻的节点的距离
if (!visited[v] && graph[u][v] != INF) { //如果节点v未访问过且u到v有连通,则更新距离
int newDist = dist[u] + graph[u][v];
if (newDist < dist[v]) {
dist[v] = newDist;
}
}
}
}
}
```
最后,我们可以调用Dijkstra函数来计算起点到其他节点的最短路径。例如,我们可以输出起点到节点i的最短距离,代码如下:
```c
int main()
{
int n, m; //n为节点数,m为边数
scanf("%d%d", &n, &m);
memset(graph, INF, sizeof(graph)); //初始化邻接矩阵为正无穷
for (int i = 0; i < n; i++) {
graph[i][i] = 0; //自己到自己的距离为0
}
for (int i = 0; i < m; i++) { //读入图的信息
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
graph[u][v] = w; //无向图,所以需要更新两次
graph[v][u] = w;
}
int start = 0; //假设起点为0
Dijkstra(start, n);
for (int i = 0; i < n; i++) {
printf("%d ", dist[i]); //输出起点到节点i的最短距离
}
return 0;
}
```
以上就是基于Dijkstra算法的最短路径求解的C语言实现。
阅读全文