警示后人
查看原帖
警示后人
377787
Hooch楼主2024/4/4 09:07

这道题网络流里的 dis 数组类型是 double,在 spfa 或者 dfs 的时候对 dis 大小的比较一定要用 eps。

比如

错误的代码(会 TLE on 9 or TLE on 23):

bool spfa() {
  fill(d + 1, d + 1 + SN, INF);
  fill(vis + 1, vis + 1 + SN, 0);
  queue <int> q; q.emplace(S); d[S] = 0;
  while (!q.empty()) {
    int u = q.front(); q.pop(); vis[u] = 0;
    for (int i = head[u]; i; i = nex[i]) {
      int v = edge[i].nxt, w = edge[i].flow; ld c = edge[i].cost;
      if (w > 0 && d[v] > d[u] + c) {
        d[v] = d[u] + c;
        if (!vis[v])
          vis[v] = 1, q.emplace(v);
      }
    }
  } 
  return (d[T] < inf);
}

正确的代码:

const ld eps = 1E-7;
int cmp(ld x, ld y) {
  if (x - eps > y) return 1;
  if (x + eps < y) return -1;
  return 0;
}
bool spfa() {
  fill(d + 1, d + 1 + SN, INF);
  fill(vis + 1, vis + 1 + SN, 0);
  queue <int> q; q.emplace(S); d[S] = 0;
  while (!q.empty()) {
    int u = q.front(); q.pop(); vis[u] = 0;
    for (int i = head[u]; i; i = nex[i]) {
      int v = edge[i].nxt, w = edge[i].flow; ld c = edge[i].cost;
      if (w > 0 && cmp(d[v], d[u] + c) == 1) {
        d[v] = d[u] + c;
        if (!vis[v])
          vis[v] = 1, q.emplace(v);
      }
    }
  }
  return (cmp(d[T], INF) == -1);
}
2024/4/4 09:07
加载中...