1, 桶优化最短路, 时间复杂度$O(m+n)$, 空间$O(C)$, $C$为最短路长度
const int N = 1e6+10; int n, m; struct _ {int to,w;}; vector<_> g[N]; int d[N]; queue<int> q[N]; void dij() { memset(d,0x3f,sizeof d); d[1] = 0, q[0].push(1); int mx = 0; REP(i,0,mx) while (q[i].size()) { int x = q[i].front(); q[i].pop(); if (d[x]<i) continue; for (auto &&e:g[x]) { int dd = d[x]+e.w; if (dd<d[e.to]) { d[e.to] = dd; if (dd>=N) continue; q[dd].push(e.to); mx = max(mx, dd); } } } }
2, 基数堆优化, 时间复杂度$O(m+nlogC)$, 空间复杂度$O(logC)$