21xrx.com
2024-09-20 00:08:45 Friday
登录
文章检索 我的文章 写文章
C++计算两点之间的所有最短路径
2023-06-25 04:04:03 深夜i     --     --
C++ 计算 两点 最短路径 算法

在计算机科学中,图论是一门重要的学科,在图论中,最短路径算法是一个经常用到的算法。比如说,如果要在一个城市中找到两个地点之间最短的路径,就可以使用最短路径算法。

在C++中,我们可以使用一种叫做 Floyd-Warshall算法来计算两点之间的所有最短路径。Floyd-Warshall算法是一种多源最短路径算法,适用于有向图或无向图,可以解决带有负权边的图的最短路径问题,因此它的适用范围非常广。

下面是使用C++实现Floyd-Warshall算法来计算两点之间所有最短路径的代码:


#define INF 0x3f3f3f3f

int v, e; //顶点数和边数

int graph[MAX_V][MAX_V]; //存储图的邻接矩阵

//Floyd-Warshall算法

void FloydWarshall()

{

  int i, j, k;

  for (k = 1; k <= v; k++) //中间顶点的编号为k

  {

    for (i = 1; i <= v; i++) //起点的编号为i

    {

      for (j = 1; j <= v; j++) //终点的编号为j

      {

        if (graph[i][k] != INF && graph[k][j] != INF

          && graph[i][k] + graph[k][j] < graph[i][j])

        {

          graph[i][j] = graph[i][k] + graph[k][j]; //更新最短路径长度

        }

      }

    }

  }

}

int main()

{

  //输入图的顶点数和边数

  cin >> v >> e;

  //初始化图的邻接矩阵

  memset(graph, INF, sizeof(graph));

  for (int i = 1; i <= v; i++)

  {

    graph[i][i] = 0;

  }

  //输入图的边权

  int from, to, weight;

  for (int i = 1; i <= e; i++)

  {

    cin >> from >> to >> weight;

    graph[from][to] = weight;

  }

  //计算两点之间所有最短路径

  FloydWarshall();

  //输出结果

  for (int i = 1; i <= v; i++)

  {

    for (int j = 1; j <= v; j++)

    {

      cout << graph[i][j] << " ";

    }

    cout << endl;

  }

  return 0;

}

使用Floyd-Warshall算法可以快速地计算两点之间的所有最短路径。当我们需要在程序中频繁地计算最短路径时,这个算法会非常有用,它可以降低程序的时间复杂度,提高程序的效率。

  
  

评论区

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