簡體   English   中英

Dijkstra 算法的一種變體

[英]A variant of Dijkstra algorithm

我從 ICPC 的 CP3 書中找到了這個算法,它是 Dijkstra 的一個變體,但在某些情況下它會提供 TLE(隱藏測試)。 雖然看起來這個算法的運行時間與 Dijkstra 相同,但我認為它是不同的。 誰能幫我解決這個算法的時間復雜度。

 vector<int> visited(N,0),dis(N,0);
 vector<pair<int,int> > adj[N];        // value, node
 void dijkstra()                    
 {
     for(int i=2;i<=N;i++)
        dis[i]=N;
     priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > pq;
     pq.push(make_pair(0,1));
     while(!pq.empty())
     {
         pair<int,int> p=pq.top();
         ll x=p.second;
         pq.pop();
         if(p.first>dis[x])
             continue;
         for(int i=0;i<adj[x].size();i++)
         {
             if(dis[adj[x][i].ss]>dis[x]+adj[x][i].first)
             {
                 dis[adj[x][i].second]=dis[x]+adj[x][i].first;
                 pq.push(make_pair(dis[adj[x][i].second],adj[x][i].second));
             }
         }
     }
 }

C++ 中的 Arrays 從零開始,即第一個索引為 0,最后一個索引為 size()-1。

 vector<int> visited(N,0),dis(N,0); <--- dis is initialized with N zero's
 vector<pair<int,int> > adj[N];        // value, node
 void dijkstra()                    
 {
     for(int i=2;i<=N;i++)
        dis[i]=N; <---- initializing i=N or dis[N] is undefined behaviour

你寫超出數組的末尾可能會導致災難性的結果。 你真正的錯誤可能是

dis[1] = 0 

它應該是 N 或 MAX_INT。

當存在特定模式的圖形時,該算法可以無限運行。 p.first>dis[x]可能並不總是true ,然后它不會退出循環。

我相信這是從原始 Dijkstra 算法改變的唯一部分

暫無
暫無

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

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