最短路径问题以及包含过路费的问题--动态规划式的解法

求最短路径的dijkstra算法(详细算法原理自行百度,本文简单从动态规划角度思考),可以看成是一个动态规划的方法。
动态规划算法通常基于一个递推公式及一个或多个初始状态。当前子问题的解将由上一次子问题的解推出。
dijkstra虽然没有递推公式,但是满足将大问题分解成子问题,当前问题的解由上一次子问题的解推出。

算法的思想是
使用了三个一维数组,分别是visit[k],pre_node[k],short[k]来分别表示是否经过k点,k点的前驱节点,到达k点的最短距离
初始状态,是所有点出了起点都没经过,所有点的前驱节点都是起点,到达所有点的最短距离是起点直达的距离(没有路径距离就是极大值)。

接着开始循环求子问题。
子问题是先找出没有经过的并且到起点最短距离不是极大值的点i(第一次肯定是离起点最近的点)
如果找不到这个点,跳出循环(结束循环的唯一条件,这样可以避免非联通图出错)
然后分别找出点i的邻点j,判断通过i到j的距离是否小于目前j到起点的距离
如果是,那就更新short[j]和pre_node[k]
最后可以通过pre_node[]来遍历最短路径

int minlength(int (*edge)[7])
{
      int short_p[7];
      int pre_node[7];
      int visit[7];
      for (int i = 1; i < 7; i++){
            visit[i] = 0;
            pre_node[i] = 1;//起点是1,初始化都从1开始,直接从起点到各个点是老路
            short_p[i] = edge[1][i];
      }
      short_p[1] = 0;
      visit[1] = 1;
      //for (int v = 0; v < 7; v++){//无法避免不是联通图的情况
      while (1){
            int min = max_n;
            int k = -1;
            for (int i = 2; i < 7; i++){
  //先找出没进过的并且离起点最近的点
                  if (!visit[i] && short_p[i] < min){
                        min = short_p[i];
                        k = i;
                  }
            }
            if (k == -1)
                  break;//找不到就跳出去,因为可能图不连通
            else
                  visit[k] = 1;
            for (int ii = 2; ii < 7; ii++){
  //以上面找到的点为基准,找出相邻没过的点,检查过这个点到相邻点近还是老路近
                  if (!visit[ii] && edge[k][ii] + min < short_p[ii]){
                        short_p[ii] = edge[k][ii] + min;
                        pre_node[ii] = k;//更改前节点
                  }
            }
      }
      return 0;
}
int main()
{
      int edge[7][7] = { max_n };
      for (
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值