#include <queue>
#include <vector>
struct Edge {
int u, v, dist;
};
struct Heapnode {
int d, u;
bool operator < (const Heapnode &rhs) const {
return d > rhs.d;
}
};
struct Dij {
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];
void init(int n) {
this->n = n;
for (int i = 0; i < n; i++) G[i].clear();
edges.clear();
}
void addedge(int u, int v, int dist) {
edges.push_back((Edge){u, v, dist});
m = edges.size();
G[from].push_back(m - 1);
}
void dijkstra(int s) {
priority_queue<Heapnode> Q;
for (int i = 0; i < n; i++) d[i] = inf;
d[s] = 0;
memset(done, 0, sizeof(done));
Q.push((Heapnode){0, s});
while (!Q.empty()) {
Heapnode x = Q.top();
Q.pop();
int u = x.u;
if (done[u]) continue;
done[u] = true;
for (int i = 0; i < G[u].size(); i++) {
Edge &e = edges[G[u][i]];
if (d[e.to] > d[u] + e.dist) {
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push((Heapnode{d[e.to], e.to}));
}
}
}
}
};
Dijkstra(Heap) - 模板
最新推荐文章于 2021-05-27 18:26:27 发布