Floyd算法---模板

来源:互联网 发布:上古卷轴5捏脸数据导入 编辑:程序博客网 时间:2024/06/08 15:16
           Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

        注意:其实很多题目不是直接问你floyd怎么求最短路径,而是要你利用floyd的动态规划思想解决类似floyd的问题。

        Floyd算法可以算边权值非负的最短路径问题。下面给出算法模板

#include<cstdio>  using namespace std;  #define INF 1e9  const int maxn=100+10;  int n,m;//点数,边数,点从0到n-1编号  int dist[maxn][maxn];//记录距离矩阵  int path[maxn][maxn];//path[i][j]=x表示i到j的路径上(除i外)的第一个点是x.  void init()  {      for(int i=0;i<n;i++)      for(int j=0;j<n;j++)      {          dist[i][j] = i==j?0:INF;//其实这里d[i][j]应该还要通过输入读数据的          path[i][j]=j;      }        //读取其他dist[i][j]的值  }  void floyd()  {      for(int k=0;k<n;k++)      for(int i=0;i<n;i++)      for(int j=0;j<n;j++)      if(dist[i][k]<INF && dist[k][j]<INF )      {          if(dist[i][j]>dist[i][k]+dist[k][j])          {              dist[i][j] = dist[i][k]+dist[k][j];              path[i][j] = path[i][k];          }          else if(dist[i][j] == dist[i][k]+dist[k][j] &&path[i][j]>path[i][k])          {              path[i][j] = path[i][k];  //最终path中存的是字典序最小的路径          }      }  }  

输出路径例程:

printf("Path: %d", u);int beg = path[u][v];while (1){printf("-->%d", beg);if (beg == v) { cout << endl; break; }beg = path[beg][v];}


原创粉丝点击