Graph 修改dijkstra';带条件的s算法

Graph 修改dijkstra';带条件的s算法,graph,dijkstra,undirected-graph,Graph,Dijkstra,Undirected Graph,给定一个边上有代价的无向图,找出从给定节点A到B的最短路径。我们这样说:除了代价和边,我们从时间t=0开始,并且对于每个节点,都会给出一个列表,其中列出了一些在该时间无法通过这些节点的时间,你不能在这段时间里做任何事情,你必须等到“它过去了”。正如声明所说,你是一名囚犯,你可以通过牢房进行传送,传送时间需要边缘时间的花费,而那些你无能为力的时间是当监护人在牢房里,并且他们在列表中给出的每个时间戳都在牢房里时,找到逃离监狱的最短时间 我尝试的是: 我试着这样修改它:在正常的dijkstra中,你在

给定一个边上有代价的无向图,找出从给定节点A到B的最短路径。我们这样说:除了代价和边,我们从时间
t=0开始,并且对于每个节点,都会给出一个列表,其中列出了一些在该时间无法通过这些节点的时间,你不能在这段时间里做任何事情,你必须等到“它过去了”。正如声明所说,你是一名囚犯,你可以通过牢房进行传送,传送时间需要边缘时间的花费,而那些你无能为力的时间是当监护人在牢房里,并且他们在列表中给出的每个时间戳都在牢房里时,找到逃离监狱的最短时间

我尝试的是:

我试着这样修改它:在正常的dijkstra中,你在你为每个节点找到的最短时间内检查它是否是守护者,但它不起作用。。还有其他想法吗

int checkGuardian(int min, int ind, List *guardians)
{
    for (List iter = guardians[ind]; iter; iter = iter->next)
        if(min == iter->value.node)
            return min + iter->value.node;

    return 0;
}

void dijkstra(Graph G, int start, int end, List *guardians)
{
    Multiset H = initMultiset();

    int *parent = (int *)malloc(G->V * sizeof(int));

    for (int i = 0; i < G->V; ++i)
    {
        G->distance[i] = INF;
        parent[i] = -1;
    }

    G->distance[start] = 0;

    H = insert(H, make_pair(start, 0));

    while(!isEmptyMultiset(H))
    {
        Pair first = extractMin(H);

        for (List iter = G->adjList[first.node]; iter; iter = iter->next)
            if(G->distance[iter->value.node] > G->distance[first.node] + iter->value.cost 
                                                + checkGuardian(G->distance[first.node] + iter->value.cost, iter->value.node, guardians))
            {
                G->distance[iter->value.node] = G->distance[first.node] + iter->value.cost 
                                                + checkGuardian(G->distance[first.node] + iter->value.cost, iter->value.node, guardians);
                H = insert(H, make_pair(iter->value.node, G->distance[iter->value.node]));
                parent[iter->value.node] = first.node;
            }
    }

    printf("%d\n", G->distance[end]);
    printPath(parent, end);
    printf("%d\n", end);
}
作为输入,您将获得节点数、边数和起始节点数。对于您正在读取的下一个数量的边行和2个节点之间的边以及与该边关联的成本,然后对于下一个数量的节点行,您正在读取一个字符“N”,如果您无法从该单元格中逃逸,则为“Y”,如果您可以从该单元格中逃逸,则为时间戳的数量,然后为时间戳的数量,时间戳的数量。 对于此输入:

6 7 1
1 2 5
1 4 3
2 4 1
2 3 8
2 6 4
3 6 2
1 5 10
N 0
N 4 2 3 4 7
Y 0
N 3 3 6 7
N 3 10 11 12
N 3 7 8 9
我希望这一产出:

12
1 4 2 6 3
10
1 4 2 6 3
但我得到的结果是:

12
1 4 2 6 3
10
1 4 2 6 3