版权声明:转载请联系QQ:1810647785 https://blog.csdn.net/weixin_42619451/article/details/82154207
堆优化
struct edge {
int next, to, v;
}e[500010];
int cnt;
int head[maxn];
inline void add(int u, int v, int w) {
e[++cnt].next = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].v = w;
}
int n, m, s;
int dis[maxn];
struct node {
int u, d;
bool operator <(const node& rhs) const {
return d > rhs.d;
}
};
inline int dij() {
for(re int i = 1; i <= n; i++) {
dis[i] = INF;
}
dis[s] = 0;
priority_queue<node> Q;
Q.push((node){s, 0});
while(!Q.empty()) {
node fr = Q.top();
Q.pop();
int u = fr.u, d = fr.d;
if(d != dis[u]) {
continue;
}
for(re int i = head[u]; i; i = e[i].next) {
int v = e[i].to, w = e[i].v;
if(dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
Q.push((node){v, dis[v]});
}
}
}
}
struct E {
int nxt, to, val;
}e[500010];
int cnt, head[maxn];
inline void add(int u, int v, int w) {
e[++cnt] = (E) {head[u], v, w};
head[u] = cnt;
}
int n, s, dis[maxn], vis[maxn], q[maxn];
inline void spfa() {
memset(dis, INF, sizeof(dis));
memset(vis, 0, sizeof(vis));
queue<int> Q;
dis[s] = 0;
Q.push(s);
while(!Q.empty()) {
int u = Q.front();
Q.pop();
vis[u] = 0;
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if(dis[v] == INF || dis[v] > dis[u] + e[i].val) {
dis[v] = dis[u] + e[i].val;
if(!vis[v]) {
vis[v] = 1;
Q.push(v);
}
}
}
}
}