[英]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.