在graph中两节点的最短路径 用c语言代码实现
时间: 2024-09-22 07:05:03 浏览: 37
在图论中,找到两个节点之间的最短路径通常涉及到寻找最短路径算法,如Dijkstra算法或Floyd-Warshall算法。这里我将简单展示如何使用Dijkstra算法,它适用于无负权重的有向或无向加权图。
以下是用C语言实现Dijkstra算法的基本步骤:
```c
#include <stdio.h>
#include <limits.h>
#define V 9 // 定义图的顶点数
#define INF INT_MAX // 设置无穷大
// 边的结构体
typedef struct {
int src, dest, weight;
} Edge;
// Dijkstra函数,从src开始查找最短路径
void dijkstra(int graph[V][V], int src, int dist[], bool visited[]) {
int i, u, v, minDistance;
for (i = 0; i < V; i++)
dist[i] = INF, visited[i] = false;
// 初始化起点到所有顶点的距离为无穷大,除了起点本身
dist[src] = 0;
for (u = 0; u < V - 1; ) {
// 找出当前未访问且距离最小的节点
minDistance = INF;
for (v = 0; v < V; v++) {
if (!visited[v] && dist[v] < minDistance)
minDistance = dist[v];
}
u = minDistance == INF ? V : minDistance; // 如果找不到更小的,则设置为终点
// 将已找到的最短距离更新至其邻接节点
visited[u] = true;
for (v = 0; v < V; v++) {
if (graph[u][v] != 0 && !visited[v] && dist[u] != INF &&
dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
}
int main() {
// 具体的图数据填充在这里
// graph是一个二维数组,每个元素表示从源节点到目标节点的边的权重
int graph[V][V];
// 使用dijkstra函数并传入参数
dijkstra(graph, 0, dist, visited);
// 输出最短路径
printf("Vertex \t\t Distance from Source\n");
for (int i = 0; i < V; ++i)
printf("%d \t\t %d\n", i, dist[i]);
return 0;
}
```
注意这只是一个基本示例,实际应用中你需要根据你的图的具体结构和需求对代码进行修改。同时,这个版本只支持非负权重的图。如果你的图包含负权重边,需要使用其他算法,例如Bellman-Ford算法。
阅读全文