A 演算法(k短路)模板 poj 2449

2021-10-08 19:12:25 字數 964 閱讀 2078

a*演算法就是在bfs擴充套件的時候優化了一下,對於乙個點x,當前花費a,到終點花費h[x],那a+h[x]就可以視作它這個點的總花費,這就可以在bfs時優先遍歷花費少的點

#include#include#include#includeusing namespace std;

#define ll long long

#include#define maxn 205000

#define mod 100003

vector>e[maxn];

vector>e1[maxn];

int h[maxn];

struct node

};priority_queueq;

struct node1

};priority_queueq1;

int vis1[maxn];

void dijk(int st)

); while(!q1.empty()));}

}}

//printf("222\n");

}int ans[maxn];

void slove(int s,int t,int k)

); memset(ans,-1,sizeof(ans));

while(!q.empty()&&p);}}

printf("%d\n",ans[k]);

}int main()

); e1[v].push_back();

}int s,t,k;

scanf("%d %d %d",&s,&t,&k);

dijk(t);

if(s==t) k++;

//for(int i=1;i<=n;i++) printf("h[%d]=%d\n",i,h[i]);

slove(s,t,k);

}

POJ 2449 第K短路 A 演算法

給定一張n個點,m條邊的有向圖,求從起點到終點t的第k短路的長度。求第k短路,我們先回憶一下dijkstra求最短路的方法。每次鬆弛了乙個節點,則將該節點放入優先佇列,然後在取優先佇列的第乙個點,即源點到該點距離最短的點,再用該點去鬆弛其他的點。最終求出的距離就是單源最短距離。換句話說,就是用優先佇...

POJ 2449 求第K短路

第一道第k短路的題目 qaq 拿裸的dijkstra 不斷擴充套件的a 給2000ms過了 題意 大意是 有n個station 要求從s點到t點 的第k短路 不過我看題意說的好像是從t到s 可能是出題人寫錯了 從這題中還真的學到了很多 1.第k短路的演算法 a 還有用邊表實現dij 注 以下部份資料...

poj 2449 第k短路徑

思路 利用乙個估計函式g i dis i len。其中len為佇列出來的點當前已經走了的距離。dis i 為該點到終點的最短路徑。這樣我們只要將點按g i 的公升序在佇列你排序,每次取出最小的g i 值的點。其意義就是每次找最短的能到終點的點。第一次找到就是最短路徑,第二次就是就是第二短,第三次就是...