Xiaolang_zzz 2023-01-03 15:28 采纳率: 100%
浏览 20
已结题

构造了一个迪杰斯特拉函数,但是不会得出最短路径的途径点信息,需要更详细的注释

问题遇到的现象和发生背景 构造了一个计算函数,如何得到最短路径的点的信息以及需要更详细的注释
遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
struct MyStack  
{
    int stack[50];//栈
    int jl;//距离
};
//迪杰斯特拉算法
MyStack Dijkstra(map Map, int d, int e)//d设为起点,e设为终点
{
    int stack[50] = { 0 }, id1 = 0;
    int stackdata[50] = { 0 }, id2 = 0;
    int stackfindlj[50][50] = { 0 }, id3 = 0;//路径保存
    int stackfindjl[50] = { 0 };//距离保存
    int isfind = 0;
    for (int i = d; i < d + 1; i++)
    {
        for (int j = i; j < 12; j++)
        {
            int edge[12][12] = { 0 };//辅助地图
            if (Map.edge[i][j] != 100 && Map.edge[i][j] != 0 && edge[i][j] == 0)
            {
                stack[id1++] = j;
                stackdata[id2++] = Map.edge[i][j];//边的距离
                edge[i][j] = 1;//辅助地图
                while (id1)
                {
                    for (int k = stack[id1 - 1]; k < 12; k++)
                    {
                        if (Map.edge[stack[id1 - 1]][k] != 100 && Map.edge[stack[id1 - 1]][k] != 0 && edge[stack[id1 - 1]][k] == 0)//开始搜寻路径
                        {
                            edge[stack[id1 - 1]][k] = 1;
                            stackdata[id2++] = Map.edge[stack[id1 - 1]][k];
                            stack[id1++] = k;
                            if (k == e)//到达了终点
                                isfind = 1;
                            break;
                        }
                        if (k == 11)
                        {
                            id1--; id2--;
                        }
                    }
                    if (isfind == 1)
                    {
                        stackfindlj[id3][0] = i + 1;
                        for (int k = 0; k < id1; k++)
                        {
                            stackfindlj[id3][k + 1] = stack[k] + 1;
                            stackfindjl[id3] += stackdata[k];
                        }
                        id3++;
                        isfind = 0;
                    }
                }
            }
        }
    }
    int min = stackfindjl[0], minidx = 0;
    for (int i = 0; i < id3; i++)
    {
        if (min > stackfindjl[i])
        {
            min = stackfindjl[i];
            minidx = i;
        }
    }
    MyStack temp = { 0 };
    memcpy(&temp.stack, &stackfindlj[minidx], sizeof(int) * 50);//将得到的最短路径复制到结构体的数组之中
    temp.jl = min;//将得到的最短距离赋值到结构体的距离中
    printf("最短路径距离为:%d\n", temp.jl);
    return temp;

运行结果及详细报错内容

只会输出最短距离

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

迪杰斯特拉函数

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

2条回答 默认 最新

  • |__WhoAmI__| 2023-01-03 15:57
    关注

    这是一个实现迪杰斯特拉算法的代码,用于求解单源最短路径问题。该算法是一种贪心算法,每次求解的时候都会找到当前能到达的点中距离起点最近的点,并从该点开始搜索下一步能到达的点,直到到达终点。

    具体来说,代码中使用了三个栈:

    1、stack 栈用来存储搜索路径中的点。
    2、stackdata 栈用来存储每条边的距离。
    3、stackfindlj 栈用来存储所有可能的路径,其中的每一行都是一条路径,第一个元素为起点,其余的元素为路径中的每个点。
    首先,从起点开始搜索,如果找到了一条边且这条边还没有访问过,就将这条边加入路径中,并将这条边的距离加入路径距离中。然后从这条边的终点开始继续搜索,如果能找到一条边且这条边还没有访问过,就将这条边加入路径中,并将这条边的距离加入路径距离中。重复这个过程直到到达终点,或者找不到新的边可以加入路径中。

    所有的路径被保存在 stackfindlj 中,其中的每一行都是一条路径。接下来,遍历所有的路径,找到路径距离最小的路径。将这条最短路径的信息复制到一个名为 temp 的结构体中,并返回这个结构体。

    这个结构体中包含两个信息:

    1、stack 数组用来存储最短路径中的点。
    2、jl 变量用来存储最短路径的距离。

    如果想输出最短路径的途径点信息,可以在输出路径距离之后添加以下代码:

    printf("最短路径为:");
    for (int i = 0; i < 50; i++) {
      if (temp.stack[i] != 0) {
        printf("%d ", temp.stack[i]);
      }
    }
    printf("\n");
    

    这段代码会依次输出最短路径中的所有点。
    仅供参考,望采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月11日
  • 已采纳回答 1月3日
  • 创建了问题 1月3日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效