进行迪克特斯拉算法的时候我们需要标记已经访问过的节点,而这个节点是否访问过的判断也是需要注意的
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;
}