如何在C中按顺序打印SSSP?

kb5ga3dv  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个工作代码,打印SSSP从目的地到源,但我希望它是在反向即源到目的地。
假设这会生成一条路径10 9 0和另一条路径5 7 0,其中3是目的节点,1是源节点/起始节点。
我希望它改为打印0 9 100 5 7

mw3dktmi

mw3dktmi1#

使用递归路径打印机。您有:

for (i = 1; i <= T->vertices; i++)
{
    if (T->parent[i] != -1)
    {
        printf("SSSP Distance from %d->%d is %d: {%d",
               T->visited[i], i, T->distance[i], i);

        j = i;
        while(T->parent[j] != -1)
        {   //the path is printed backwards, but still in order.
            j = T->parent[j];
            printf("<-%d", j);
        }
        printf("}\n");
    }   
}

考虑添加函数:

static void path_printer(SomeType *T, size_t i)
{
    size_t j = T->parent[i];
    if (j != -1)
    {
        path_printer(T, j);
        if (T->parent[j] != -1)
            printf("->");
        printf("%d", i);
     }
}

并将循环修改为:

for (i = 1; i <= T->vertices; i++)
{
    if (T->parent[i] != -1)
    {
        printf("SSSP Distance from %d->%d is %d: {",
               T->visited[i], i, T->distance[i]);
        path_printer(T, i);
        printf("}\n");
    }   
}

递归函数以相反的顺序打印列表项;剩下的都是表面文章。

注意:未经测试的代码!

由于这个问题没有提供MCVE(Minimal, Complete, Verifiable Example-或MRE或SO现在使用的任何名称)或SSCCE(Short, Self-Contained, Correct Example-相同的概念用不同的名称),所以不可能测试这个建议的解决方案。我不得不猜测变量T的类型名称-我认为它是SomeType *

hsgswve4

hsgswve42#

您可以考虑先使用堆栈存储遍历结果,然后输出堆栈的内容,这样就可以给予您想要的结果。

相关问题