最幸运的小孩(ง •̀_•́)ง 2024-04-22 09:19 采纳率: 10.5%
浏览 1

dijkstra算法之中的优化版算法

dijkstra算法之中的优化版算法

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1e6 + 10;

int n, m;
int h[N], w[N], e[N], ne[N], idx;
int dist[N];
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j], j});
            }
        }
    }

    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

int main()
{
    scanf("%d%d", &n, &m);

    memset(h, -1, sizeof h);
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);
    }

    printf("%d\n", dijkstra());

    return 0;
}



中的

 priority_queue<PII, vector<PII>, greater<PII>> heap;

是什么意思,每部分PII 、vector、以及greater有什么含义

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-04-22 09:19
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题的目的是解释C++代码中priority_queue的使用,特别是它与pair<int, int>vector<pair<int, int>>greater<pair<int, int>>的组合,以及它们在Dijkstra算法优化版中的作用。

    问题出现原因

    这个问题出现的原因可能是由于对C++标准库中的priority_queue模板类及其用法不够熟悉,特别是当它与自定义数据结构(如pair<int, int>)一起使用时。在Dijkstra算法中,priority_queue用于选择下一个最近的节点进行处理,这是算法效率的关键部分。

    问题解决方案

    在Dijkstra算法中,priority_queue用于存储节点和它们对应的距离。以下是对代码中priority_queue声明部分的解释:

    • pair<int, int>:这是一个自定义的数据结构,用于存储两个整数。在Dijkstra算法中,通常第一个整数表示节点之间的距离,第二个整数表示节点的标识符。

    • vector<pair<int, int>>:这是一个存储pair<int, int>的容器,它允许动态数组的存储和操作。这里它作为priority_queue的底层容器,用于存储节点和距离的集合。

    • greater<pair<int, int>>:这是一个比较函数对象,它定义了priority_queue中元素的排序方式。greater意味着priority_queue将按照从大到小的顺序对元素进行排序。在Dijkstra算法中,我们希望每次从队列中取出具有最小距离的节点,因此使用greater来实现这一点。

    提供示例

    以下是优化后的代码段,它修正了原始代码中的一些错误,并提供了更清晰的结构:

    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    typedef pair<int, int> PII;
    const int N = 1e6;
    int n, m;
    int h[N], w[N], e[N], ne[N], idx;
    int dist[N];
    bool st[N];
    
    void add(int a, int b, int c) {
        e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++;
    }
    
    int dijkstra() {
        memset(dist, 0x3f, sizeof dist);
        dist[1] = 0;
        priority_queue<PII, vector<PII>, greater<PII>> heap;
        heap.push({0, 1});
    
        while (heap.size()) {
            auto t = heap.top();
            heap.pop();
            int ver = t.second, distance = t.first;
            if (st[ver]) continue;
            st[ver] = true;
            for (int i = h[ver]; i != -1; i = ne[i]) {
                int j = e[i];
                if (dist[j] > dist[ver] + w[i]) {
                    dist[j] = dist[ver] + w[i];
                    heap.push({dist[j], j});
                }
            }
        }
    
        if (dist[n] == 0x3f3f3f3f) return -1;
        return dist[n];
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        memset(h, -1, sizeof h);
        while (m--) {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            add(a, b, c);
        }
        printf("%d\n", dijkstra());
        return 0;
    }
    

    示例代码运行方式

    要运行这段代码,你需要一个支持C++的编译器,如GCC或Clang。将代码保存为.cpp文件,然后在命令行中使用编译器编译并运行它,例如:

    g++ -o dijkstra dijkstra.cpp
    ./dijkstra
    

    示例代码预期运行结果

    代码将读取输入的图的信息,使用优化版的Dijkstra算法计算从节点1到节点n的最短路径,并输出这个距离。如果不存在这样的路径,则输出-1。具体的输出结果将取决于输入的图的数据。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日