【问题标题】:A variant of Dijkstra algorithmDijkstra 算法的一种变体
【发布时间】:2021-08-29 02:00:21
【问题描述】:

我从 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));
             }
         }
     }
 }

【问题讨论】:

  • .ff 是pair的第一个值,.ss 是访问第二个值。
  • 这对存储 &lt;weight, connecting node&gt; 用于特定边缘
  • 很抱歉,这是错误的。我改正了
  • 其实是我自己写的,但没有贴出整个代码,因为很难阅读
  • 然后停止为每个人都知道的事物#defining 新的、非描述性的名称。无论如何...您正在使用 dis[N],但它的索引最多只有 N-1。估计也去过。这些是缓冲区溢出。此外,dis[i]=N 不一定是足够高的值。在 C++ 中,您应该从 0 开始计数

标签: c++ algorithm time-complexity dijkstra


【解决方案1】:

C++ 中的数组是从零开始的,即第一个索引是 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。

【讨论】:

    【解决方案2】:

    当存在特定模式的图形时,此算法可以无限运行。 p.first&gt;dis[x] 可能并不总是true 然后它不会退出循环。

    我相信这是唯一改变原始 Dijkstra 算法的部分

    【讨论】:

    • 这对我没有任何帮助
    • 只有在 dis 元素减少时才会在循环中进行推送。假设每个顶点的非负边权重,每个顶点最多只能发生N 次,因此无论确切的复杂性如何,算法最终都会在假设非负边权重的情况下终止。
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2017-04-10
    • 2012-07-16
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多