Floyd算法:
如何简单方便的求出图中任意两点的最短路径
Floyd-Warshall算法(O(n)比较适用于边较多的稠密图(Dense Graph))
Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图也可以是有向图,边权可以为负,但是不能存在负环(可根据最小环的正负来判定).
思想:
Floyd算法基于动态规划的思想,以 u 到 v 的最短路径至少经过前 k 个点为转移状态进行计算,通过 k 的增加达到寻找最短路径的目的.当 k 增加 1 时,最短路径要么不边,如果改变,必经过第 k 各点,也就是说当起点 u 到第 k 个点的最短距离加上第 k 个点到终点 v 的最短路径小于不经过第 k 个节点的最优最短路经长度的时候更新 u 到 v 的最短距离. 当 k = n 时, u 到 v 的最短路径就确定了.
代码:
int n,m,d[100][100];//点数,边数,邻接矩阵 scanf("%d%d",&n,&m); memset(d,INF,sizeof(d));//初始化邻接矩阵 for(int i=1;i<=n;i++){ d[i][i]=0; } for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c);//边的信息 d[a][b]=c; //d[b][a]=c 无向图调用 } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(d[i][k]<INF&&d[k][j]<INF){ //判断是否能从松弛点到达 d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } }