今天還是搞一下這個迪傑斯特拉的優先佇列優化演算法吧。對於我們經常用的二維陣列來存圖的話,只要資料一大,就會超出記憶體,也可能tle,所以我們使用優化後的演算法。(迪傑斯特拉堆優化)
**:
#include#include#include#include#include#includeconst int maxn=1005;
const int inf=0x3f3f3f3f;
typedef long long ll;
using namespace std;
typedef pairp;
int vis[maxn];
int d[maxn];
int n,m,start;
vectors[maxn]; //存圖
void dij(int start)
); while(!q.empty())
); s[v].push_back();
} int a,b;
scanf("%d%d",&a,&b);
dij(a);
if(d[b]!=inf)
printf("%d\n",d[b]);
else
printf("-1\n");
}return 0;
}
說一下,我們首先得存圖,我們使用鄰接表來實現存圖,二維vector 來實現,然後我們在後面的優先佇列中,我們可以使用結構體重載一下,也可以直接用pair +優先佇列排序,兩種方法都可以使用,直接使用乙個pair 就比較再來乙個結構體簡單。 其中的原理就是跟迪傑斯特拉一模一樣,就是現將起始點壓入佇列中,然後再看圖,從這個點出去的乙個最小權值的點,然後從這個點再連線到其他的點 ,我們更新權值,看是直接到那個點短,還是先走乙個點再到那個點快,更新一下資料,然後再將那個點壓入佇列中,然後再進行後面的操作,就這樣一直一直進行,直到最後將所有點都標記完全結束。 迪傑斯特拉 優先佇列優化
優先佇列 是一種特殊的佇列。這種佇列會自動的將佇列裡面的元素進行排序,這種排序是可定義的。這二者如何結合呢?我們都知道。迪傑斯特拉演算法每一步都需要找屬於vb集合中找乙個距離最小的點把他加入到va集合中,每一次都需要找。所以普通版的迪傑斯特拉演算法的時間複雜度是n n。因為每一步都需要找距離最小的點...
優化迪傑斯特拉
1 include 2 include 3 include 4 define heap pair5 第乙個int存的是到起點的距離,第二個int存的是點的編號67 using namespace std 89 const int inf 2147483647 10 intn,m,t,cnt 11in...
迪傑斯特拉堆優化
使得最短路演算法時間複雜度再次加快了乙個檔次變成了n log 2 nn log 2 n n log2 n 讓人更加頭禿 來說原理的話我建議可以講一下迪傑斯特拉的演算法思想,利用貪心,每一次走距離當前點u uu最近的點v vv,那麼我們由原點到v vv一定會是最近的,因為u uu一開始就是最近的,那麼...