TLE in codeforce's Dijkstra

TLE in codeforces's Dijkstra

本文关键字:Dijkstra in codeforce TLE      更新时间:2023-10-16

我刚刚学习了Dijkstra的算法,解决了一些问题,我正在努力解决这个问题http://codeforces.com/problemset/problem/20/C问题,但我在一个大型测试用例中遇到了超过时间限制的问题,我想知道我的代码是否可以以任何方式进一步优化,或者是否有任何其他更快的Dijkstra实现,然后告诉我。
我的代码

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define vp vector<pii>
int p[100010],d[100010];
void printer(int current)
{
    if(p[current]==-2)
    {
        printf("%d ",current);
        return;
    }
    printer(p[current]);
    printf("%d ",current);
}
class Prioritize
{
    public:
    int operator()(const pii &p1,const pii &p2)
    {
        return p1.second<p2.second;
    }
};
int main()
{
    priority_queue<pii, vp, Prioritize> Q;
    int nv;
    scanf("%d",&nv);
    vp g[nv+1];
    int ne,u,v,w;
    scanf("%d",&ne);
    for(int i=0;i<ne;i++)
    {
        scanf("%d %d %d",&u,&v,&w);
        g[u].push_back(pii(v,w));
        g[v].push_back(pii(u,w));
    }
    int source=1;
    int size;
    for(int i=1;i<=nv;i++)
    {
        d[i]=INT_MAX;
        p[i]=-1;
    }
    d[source]=0;
    p[source]=-2;//marker for source.
    Q.push(pii(source,d[source]));
    while(!Q.empty())
    {
        u=Q.top().first;
        Q.pop();
        size=g[u].size();
        for(int i=0;i<size;i++)
        {
            v=g[u][i].first;
            w=g[u][i].second;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                p[v]=u;
                Q.push(pii(v,d[v]));
            }
        }
    }
    /*for(int i=1;i<=nv;i++)
    {
        printf("Node %d and min weight = %d and parent = %dn",i,d[i],p[i]);
    }*/
    if(p[nv]==-1)
    {
        printf("%dn",-1);
        return 0;
    }
    printer(nv);
    return 0;
}

您的算法具有复杂性O(nm)。我建议添加以下

    Q.push(pii(source,d[source]));
    while(!Q.empty())
    {
        u=Q.top().first;
        int curD = Q.top().second; //this
        if( curD > d[u]) continue; //and this
        Q.pop();
        size=g[u].size();
        for(int i=0;i<size;i++)
        {

变更后的复杂性将为O(mlogn)。如果你现在是俄罗斯人,你会读http://e-maxx.ru/algo/dijkstra_sparse