最短路径(Dijkstra和Floyd)

Floyd算法(有点类似dp的思想)Floyd(弗洛伊德)算法的基本思想是:对一个顶点个数为n的有向网(或无向网),设置一个n×n的方阵A,其中除对角线的矩阵元素都等于外,其他元素A(k)[i][j] (i≠j)表示从顶点vi到顶点vj的有向路径长度.(时间复杂度为O(n^3))


int edge[M][M];//邻接矩阵    同时可以记录从i到j最短路径

for(i=1;i<=n;i++)//矩阵初始化
        {
            for(j=1;j<=n;j++)
            {

                 if(i==j)
                {
                    edge[i][j]=0;
                    continue;
                }
               edge[i][j]=INF;
            }
        }

for(k=1;k<=n;k++)//  k为借助的中间点 
        {
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                {
                    if(k==i||k==j)
                        continue;
                    edge[i][j]=Min(edge[i][j],edge[i][k]+edge[k][j]);    //这块自己感觉就是dp,edge[i][j]存储的为从i到j的最短路径,从A到C最短路径取edge[i][j](直达)和

                                                                                                       //edge[i][k]+edge[k][j](借助中间点k   非直达)的最小值
                }
            }
        }



Dijkstra算法(记录的是从源点v0到其他各个顶点的最短路径,而Floyd算法的edge数组记录的从i到j的最短路径。(时间复杂度(O(n^2)))


int edge[MAXN][MAXN];//邻接矩阵
int dis[MAXN];//记录当前找到的从源点v0到终点vi的最短路径的长度,初始时,dist[i]为Edge[v0][i],即邻接矩阵的第v0行。
int S[MAXN];//标记有没找到最短路径  如找到s[i]=1,else s[i]=0;   初始时,S[v0]为1,其余为0,表示最初集合S中只有顶点v
int max;
void Dijkstra(int v0)//求顶点v0到其他顶点的最短路径
{
    int i,j,k;
    for(i=1;i<=max;i++)
    {
        S[i]=0;
        dis[i]=edge[v0][i];
    }
    S[v0]=1;
    dis[v0]=0;
    for(i=1;i<=max-1;i++)//从顶点v0确定n-1条最短路径   所以只用循环max-1次
    {
        int min=INF;
        int u=v0;        //u为最小的还未找到最短路径的点

         //选择当前集合T中具有最短路径的顶点u
        for(j=1;j<=max;j++)
        {
            if(!S[j]&&dis[j]<min)
            {
                u=j;min=dis[j];
            }
        }
        S[u]=1;     //表示u点的最短路径已经找到

        //不断修改dis数组值    每次k循环完都是当前这个i循环下的最优解

        for(k=1;k<=max;k++)
        {
            if(!S[k]&&edge[u][k]<INF&&(dis[u]+edge[u][k]<dis[k]))  
            {
                dis[k]=dis[u]+edge[u][k];
            }
        }
    }
}

该数组初始化和Floyd算法一样

for(i=0;i<=MAXN;i++)
        {
            for(j=0;j<=MAXN;j++)
            {
                if(i==j)
                {
                    edge[i][j]=0;
                    continue;
                }
              edge[i][j]=INF;
            }
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值