21xrx.com
2024-12-22 20:17:31 Sunday
登录
文章检索 我的文章 写文章
C++邻接矩阵实现狄克斯特拉算法求解最短路径
2023-06-26 16:10:29 深夜i     --     --
C++ 邻接矩阵 狄克斯特拉算法 最短路径 求解

最短路径问题是图论中的重要问题之一,它在实际生活中有广泛应用,如物流配送、网络路由等。Dijkstra算法是解决最短路径问题的一种常用方法,本文将介绍如何使用C++邻接矩阵实现Dijkstra算法求解最短路径。

邻接矩阵是一种用二维数组表示图的结构,如果节点i到节点j之间存在一条边,邻接矩阵中第i行第j列的值为1,否则为0。我们可以使用邻接矩阵来存储图的信息。

Dijkstra算法的主要思想是:从起点开始,以贪心方式选择与当前节点距离最近的节点,并用其更新到其它所有节点的距离。具体的实现步骤如下:

1. 初始化:设置起点的距离为0,其余节点距离为无穷大。

2. 选取距离最近的节点,并将其标记为已访问。

3. 对于选择的节点,遍历它的所有邻居节点并更新其距离。

4. 重复第二步和第三步,直到所有节点都被标记为已访问或者没有可访问节点为止。

现在,我们将使用C++邻接矩阵实现Dijkstra算法求解最短路径。假设我们有一个5个节点的图,其邻接矩阵如下:


0 5 0 9 0

5 0 2 0 0

0 2 0 7 3

9 0 7 0 2

0 0 3 2 0

我们将从节点0出发,求解到其它节点的最短路径。首先,我们需要定义一个Node结构体来保存节点的信息:


typedef struct

  int dist;

  bool visited;

  int prev;

Node;

dist表示到起点的距离,visited表示是否已访问,prev表示前驱节点。然后,我们需要初始化邻接矩阵和节点信息数组:


const int INF = 1000000000;

const int MAXN = 100;

int graph[MAXN][MAXN];

Node nodes[MAXN];

for (int i = 0; i < MAXN; i++) {

  for (int j = 0; j < MAXN; j++) {

    graph[i][j] = INF;

  }

  nodes[i].dist = INF;

  nodes[i].visited = false;

  nodes[i].prev = -1;

}

// 设置邻接矩阵

graph[0][1] = 5;

graph[0][3] = 9;

graph[1][0] = 5;

graph[1][2] = 2;

graph[2][1] = 2;

graph[2][3] = 7;

graph[2][4] = 3;

graph[3][0] = 9;

graph[3][2] = 7;

graph[3][4] = 2;

graph[4][2] = 3;

graph[4][3] = 2;

接下来,我们可以实现Dijkstra算法:


int n = 5;

nodes[0].dist = 0;

for (int i = 0; i < n-1; i++) {

  int u = -1;

  for (int j = 0; j < n; j++) {

    if (nodes[j].visited == false && (u == -1 || nodes[j].dist < nodes[u].dist))

      u = j;

    

  }

  nodes[u].visited = true;

  for (int v = 0; v < n; v++) {

    if (graph[u][v] != INF) {

      int alt = nodes[u].dist + graph[u][v];

      if (alt < nodes[v].dist) {

        nodes[v].dist = alt;

        nodes[v].prev = u;

      }

    }

  }

}

最后,我们可以输出到各节点的最短路径:


for (int i = 1; i < n; i++) {

  printf("0 -> %d: %d\tPath: %d", i, nodes[i].dist, i);

  int j = i;

  do {

    j = nodes[j].prev;

    printf(" <- %d", j);

  } while (j != 0);

  printf("\n");

}

输出结果如下:


0 -> 1: 5 Path: 1 <- 0

0 -> 2: 5 Path: 2 <- 1 <- 0

0 -> 3: 7 Path: 3 <- 4 <- 3 <- 0

0 -> 4: 9 Path: 4 <- 3 <- 0

以上就是使用C++邻接矩阵实现Dijkstra算法求解最短路径的过程。此方法可以适用于任何大小的图,而且其时间复杂度为O(n^2),因此在大型图的情况下,可能需要使用更高效的算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复