簡體   English   中英

Codeforces的Dijkstra中的TLE

[英]TLE in codeforces's Dijkstra

我剛剛學習了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 = %d\n",i,d[i],p[i]);
    }*/
    if(p[nv]==-1)
    {
        printf("%d\n",-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM