最短路径

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;     
}

可以处理带有负权边(边的值是负数)的图,但不能处理带有负权回路(从某个点出发又回到自己的路径且这个环上的所有权值之和为负数)的图

posted @ 2021-01-16 22:18  TXCCXT  阅读(138)  评论(0)    收藏  举报