spfa
  • 板块灌水区
  • 楼主Infinity_Fantasy
  • 当前回复18
  • 已保存回复19
  • 发布时间2024/9/25 20:39
  • 上次更新2024/9/25 22:40:27
查看原帖
spfa
571265
Infinity_Fantasy楼主2024/9/25 20:39
struct edge {
  int v, w;
};

vector<edge> e[maxn];
int dis[maxn], cnt[maxn], vis[maxn];
queue<int> q;

bool spfa(int n, int s) {
  memset(dis, 0x3f, (n + 1) * sizeof(int));
  dis[s] = 0, vis[s] = 1;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop(), vis[u] = 0;
    for (auto ed : e[u]) {
      int v = ed.v, w = ed.w;
      if (dis[v] > dis[u] + w) {
        dis[v] = dis[u] + w;
        cnt[v] = cnt[u] + 1;  // 记录最短路经过的边数
        if (cnt[v] >= n) return false;
        // 在不经过负环的情况下,最短路至多经过 n - 1 条边
        // 因此如果经过了多于 n 条边,一定说明经过了负环
        if (!vis[v]) q.push(v), vis[v] = 1;
      }
    }
  }
  return true;
}

这段代码是oi-wiki上的spfa,想问一下其中的vis作用大吗?感觉用处不大,不写好像跑的更快了(好像主要是因为多测清空数组导致的)?

2024/9/25 20:39
加载中...