用c语言写一个图的最短路径,并具体给出a到b的最短路径及其数值
时间: 2024-02-17 07:02:26 浏览: 74
图的最短路径(C语言)
4星 · 用户满意度95%
要用C语言写一个图的最短路径,一般可以使用Dijkstra算法或者Floyd算法。下面以Dijkstra算法为例给出示例代码。
首先定义一个图的结构体,其中包括节点数、边数和邻接矩阵等信息:
```c
#define MAXN 1000
#define INF 0x3f3f3f3f
typedef struct Graph {
int n; // 节点数
int m; // 边数
int mat[MAXN][MAXN]; // 邻接矩阵
} Graph;
```
接下来定义Dijkstra算法的实现函数,其中dist数组表示从起点到各个节点的最短距离,path数组表示最短路径上的前驱节点:
```c
void dijkstra(Graph *g, int start, int dist[], int path[]) {
bool visited[MAXN] = {false};
for (int i = 0; i < g->n; i++) {
dist[i] = INF;
path[i] = -1;
}
dist[start] = 0;
for (int i = 0; i < g->n; i++) {
int u = -1;
for (int j = 0; j < g->n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
if (u == -1 || dist[u] == INF) break;
visited[u] = true;
for (int v = 0; v < g->n; v++) {
if (!visited[v] && g->mat[u][v] < INF) {
int d = dist[u] + g->mat[u][v];
if (d < dist[v]) {
dist[v] = d;
path[v] = u;
}
}
}
}
}
```
最后,我们可以使用以上代码求出从节点a到节点b的最短路径及其距离,代码如下:
```c
int main() {
Graph g;
scanf("%d%d", &g.n, &g.m);
memset(g.mat, INF, sizeof(g.mat));
for (int i = 0; i < g.n; i++) {
g.mat[i][i] = 0;
}
for (int i = 0; i < g.m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
g.mat[u][v] = w;
g.mat[v][u] = w;
}
int dist[MAXN], path[MAXN];
dijkstra(&g, a, dist, path);
printf("从%d到%d的最短路径为:", a, b);
int p = b;
while (p != -1) {
printf("%d ", p);
p = path[p];
}
printf("\n距离为:%d\n", dist[b]);
return 0;
}
```
其中a、b为起点和终点,输入格式为:
```
节点数 边数
u1 v1 w1
u2 v2 w2
...
```
例如,输入:
```
5 7
0 1 2
0 2 4
1 2 1
1 3 7
2 3 3
2 4 2
3 4 5
```
则输出为:
```
从0到4的最短路径为:4 2 0
距离为:6
```
阅读全文