最短路径
1. Floyed Warshall
时间复杂度是O(n^3),可以用来求解多元最短路径的问题,从里到外的三层循环的变量分别是k,i,j
基本思想: 最开始只允许经过1号点中转,接下来只允许经过1和2号顶点中转……允许经过1~n号所有顶点进行中转,求任意两点的最短距离,其实就是:从i号顶点到j号顶点只经过前k号点的最短路径。
本质是动态优化(还没学)
代码
#include<stdio.h> int main() { int e[100][100],k,i,j,n,m,t1,t2,t3; int inf = 0x3f3f3f3f; scanf("%d%d",&n,&m); //n表示顶点个数,m表示边的个数 //初始化 for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j){ e[i][j]=0; } else{ e[i][j]=inf; } } } for(i=1;i<=m;i++) { scanf("%d%d%d",&t1,&t2,&t3); e[t1][t2] = t3; } //Floy-Warshall 算法核心语句 for(k=1;k<=n;k++){ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(e[i][k]<inf && e[k][i]<inf && e[i][j]>e[i][k]+e[k][j]){ //保证和不超出int范围(只要把inf的值设置为比最大路径还要大的数即可) e[i][j]=e[i][k]+e[k][j]; } } } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ printf("%10d",e[i][j]); } printf("\n"); } return 0; }
可以处理带有负权边(边的值是负数)的图,但不能处理带有负权回路(从某个点出发又回到自己的路径且这个环上的所有权值之和为负数)的图

浙公网安备 33010602011771号