最短路径 dijkstra bellford floyed

最短路径

第一种算法  Dijkstra  算法   值得注意的是它区别于bellford算法的不同就是特不包含负权值   也就是负值  这是最基本的最短路算法

2)算法步骤:

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

代码实现

void dijkstra()
{
    int f[100],k,i,j,k1;
    bool p[100]= {0};
    int min;
    p[s]=1;
    min=999999;
    for(i=1; i<=n; i++)
    {
        f[i]=c[s][i];
    }
    for(j=1; j<=n; j++)
    {
        min=999999;
        k1=0;
        for(i=1; i<=n; i++)
            if(!p[i]&&f[i]!=0&&f[i]<min)
            {
                min=f[i], k1=i;
            }
        p[k1]=1;
        if(k1==0) break;
        for(i=1; i<=n; i++)
            if(!p[i]&&c[k1][i]>0)
                if(f[k1]+c[k1][i]<f[i]||f[i]==0)
                {
                    f[i]=f[k1]+c[k1][i];
                }
    }
    if(f[t]==0)cout<<"no way!"<<endl;
    else
        cout<<f[t]<<endl;
}

接下来就是有负数的bellford算法时间复杂度O(n3)

代码实现

void bellford()

{

 int i,j; bool p=0; int f[100];

 for(i=1;i<=n;i++) f[i]=999999;

 f[s]=0;

 while(!p)

  {

   p=1;

   for(i=1;i<=n;i++)

         if(f[i]!=999999)

           for(j=1;j<=n;j++)

            if(c[i][j]>0&&f[i]+c[i][j]<f[j])

                     {

                     f[j]=f[i]+c[i][j];

                     p=0;

                     }

  }

 if(f[t]==999999) cout<<"noway!"<<endl;

 else cout<<f[t]<<endl;

}

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值