C语言求不带权无向连通图从顶点1-4的一条最短路径
时间: 2024-01-22 13:18:26 浏览: 72
C语言寻找无向图两点间的最短路径
可以使用Dijkstra算法来求不带权无向连通图从顶点1到4的一条最短路径。
具体步骤如下:
1. 定义一个数组dist,用于存储从顶点1到各个顶点的最短距离。初始时,将dist数组中除了dist[1]之外的元素都赋值为无穷大,dist[1]赋值为0。
2. 定义一个数组visited,用于表示各个顶点是否已被访问。初始时,将visited数组中除了visited[1]之外的元素都赋值为false,visited[1]赋值为true。
3. 从与顶点1相邻的顶点中选择距离顶点1最近的顶点v(即dist[v]最小),将v标记为已访问。
4. 对于与v相邻的未访问顶点u,如果通过v可以使得从顶点1到u的距离更短,则更新dist[u]的值。
5. 重复步骤3和4,直到所有顶点都被访问过或者没有与已访问顶点相邻的未访问顶点。
最后,dist[4]即为从顶点1到顶点4的最短距离。
以下是使用C语言实现Dijkstra算法的示例代码:
```c
#include <stdio.h>
#define INF 1000000 // 定义无穷大
// 定义邻接矩阵
int graph[5][5] = {
{0, 1, 1, 0, 0},
{1, 0, 1, 1, 0},
{1, 1, 0, 1, 0},
{0, 1, 1, 0, 1},
{0, 0, 0, 1, 0}
};
int dijkstra(int start, int end)
{
int dist[5]; // 存储从顶点1到各个顶点的最短距离
int visited[5] = {0}; // 存储各个顶点是否已被访问
int i, j, min, u;
// 初始化dist数组
for (i = 1; i <= 4; i++) {
if (i == start) {
dist[i] = 0;
} else {
dist[i] = INF;
}
}
// Dijkstra算法
for (i = 1; i <= 4; i++) {
// 找到距离顶点1最近的未访问顶点
min = INF;
for (j = 1; j <= 4; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
visited[u] = 1;
// 更新与u相邻的未访问顶点的dist值
for (j = 1; j <= 4; j++) {
if (!visited[j] && graph[u][j] && dist[u] + 1 < dist[j]) {
dist[j] = dist[u] + 1;
}
}
}
return dist[end];
}
int main()
{
int distance = dijkstra(1, 4);
printf("从顶点1到顶点4的最短距离为:%d\n", distance);
return 0;
}
```
阅读全文