鱼C论坛

 找回密码
 立即注册
查看: 2302|回复: 1

迪杰斯特拉算法实现错误

[复制链接]
发表于 2019-10-30 22:34:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编写的时候思想如下:
二维矩阵存储两个节点之间边的权重,若不相连接为INF
首先从节点1开始,1和其他节点之间的权重,若不为INF则可能是最短路径,进行判断
判断:1 存储到目标点的值为0,此时看目标点是否为0,如果目标点是1则不许修改,否则修改成到当前点的值加上当前点到目标点的值
        2 判断到目标点的值是否小于当前点的值加上当前点到目标点的值,如果是,修改成当前点的值加上当前点到目标点的值
一轮循环之后取最短的路径并将其在buf中的对应位置1表示已取得最小值,然后将下一边轮换的节点换成此值然后进行下一轮循环
当buf中所有值都为1时跳出循环,返回数组,数组中的值是从节点1到其他节点的最短路径,在main之中打印出来
代码如下:
  1. #include <stdio.h>
  2. #define INF 1000

  3. int * Dijiesitela(int [][8]);
  4. int get_min(int * tar,int * exi,int n);
  5. int all(int * n);
  6. int main(void)
  7. {
  8.     int * DJ_return;

  9.     int dis [][8] =    {
  10.                             {0,1,INF,INF,INF,INF,7,INF},
  11.                             {1,0,2,INF,INF,INF,INF,9},
  12.                             {INF,2,0,3,INF,INF,INF,INF},
  13.                             {INF,INF,3,0,4,INF,INF,INF},
  14.                             {INF,INF,INF,4,0,5,INF,10},
  15.                             {INF,INF,INF,INF,5,0,6,INF},
  16.                             {7,INF,INF,INF,INF,6,0,8},
  17.                             {INF,9,INF,INF,10,INF,8,0}
  18.                         };

  19.     DJ_return = Dijiesitela(dis);

  20.     for(int i = 0;i<8;i++)
  21.         printf("%d\r\n",*DJ_return);

  22.     return 0;
  23. }

  24. int * Dijiesitela(int dir[][8])
  25. {
  26.     int buf_return[8] = {0};
  27.     int buf[8] = {0};
  28.     buf [0] = 1;
  29.     int i,j,k;
  30.     i = j = k =0;
  31.     while(1)
  32.     {
  33.         for(i=0;i<8;i++)
  34.         {
  35.             if(dir[k][i]!=INF)                                      //!=INF的话才可能成最短路径
  36.             {
  37.                 if((!buf_return[i]&&i!=0) || (buf_return[k]+dir[k][i]<buf_return[i]))                            //如果buf_return[i]==0,之前没有路径直接给值
  38.                     buf_return[i] = buf_return[k]+dir[k][i];
  39.             }
  40.         }
  41.         j = get_min(buf_return,buf,8);
  42.         k = j-1;
  43.         buf[k] = 1;

  44.         if(all(buf))
  45.             break;
  46.     }

  47.     return buf_return;
  48. }

  49. int get_min(int * tar,int * exi,int n)
  50. {
  51.     int i;
  52.     int min = 0;
  53.     int i_return;
  54.     for(i=0;i<n;i++)
  55.     {
  56.         if(!exi[i])
  57.         {
  58.             if(!min)
  59.                {
  60.                 if(tar[i])
  61.                 {
  62.                     min = tar[i];
  63.                     i_return = i;
  64.                 }
  65.                }
  66.         else if(tar[i]<min)
  67.         {
  68.             min = tar[i];
  69.             i_return = i;
  70.         }
  71.         }
  72.     }
  73.     return i_return+1;
  74. }

  75. int all(int * n)
  76. {
  77.     int counter;

  78.     for(int i =0;i<8;i++)
  79.     {
  80.         if(*(n+i) == 1)
  81.             counter ++;
  82.     }
  83.     if(counter == 8)
  84.         return 1;

  85.     return 0;
  86. }
复制代码


编译通过,但是卡死了,条件限制debug不了,求帮忙看看哪里出了问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-30 22:35:17 | 显示全部楼层
忘记设置赏金了,最佳答案联系我我重发一个帖子给
赏金10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 13:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表