进行迪克特斯拉算法的时候我们需要标记已经访问过的节点,而这个节点是否访问过的判断也是需要注意的
int dikj() {
priority_queue<pair<int, int>> q;
int ma = 0;
//vis[start] = 1; // 记录一下 不用写
for (int i = 0; i <= n; i++) vis[i] = 0,di[i] = 0xffffff;
//vis[start] = 1;
q.push({ 0,start });
while (q.size()) {
int dis = -q.top().first, node = q.top().second;
q.pop();
if (vis[node]) continue; //一取出来就要判断
vis[node] = 1;
for (int i = h[node]; i != -1; i = ne[i]) {
int to = e[i];
//if (vis[to]) continue; // 不是在这里判断
//vis[to] = 1;
int newdis = energy[i] + dis; // 这是新的距离
if (newdis < di[to]) {
di[to] = newdis;
q.push({ -newdis, to });
}
/* ma = max(ma, newdis);*/
}
}
for (int i = 1; i <= n; i++) {
if (di[i] == 0xffffff) continue;
ma = max(ma, di[i]);
}
return ma;
}
我们需要拿节点出来的时候就判断,而不是每次找临边的时候再判断
并且,我们的 i 是我们边的编号,而我们 的to是我们这条边的节点之一(另外一个节点是 node )
顺便贴上add方法
void add(int a, int b, int ener, int value) {
e[++idx] = b;
ne[idx] = h[a]; h[a] = idx;
energy[idx] = ener, va[idx] = value;
}