今天在写上下界最小流的时候,用 dinic 怎么写都会 T 一两个点,卡常未果。然后发现建完图直接跑最大流也会 T 。
参考了别人的提交记录,把原来 dinic 的 dfs 从这样
ll rest = flow;
for (int &i = now[u]; i && rest; i = edge[i].nxt) {
int v = edge[i].to;
ll w = edge[i].w;
if (d[v] != d[u] + 1 || !w) continue;
ll k = dinic(v, min(rest, w));
if (!k) d[v] = 0;
edge[i].w -= k, edge[i ^ 1].w += k;
rest -= k;
}
在 for 循环最后加了一句
if (!rest) return flow;
后就跑的飞快,可以看到第 8 个点从 1050+ms 到了 15ms ,将近 100 倍。
发现其主要问题在于写当前弧的时候 i 是引用,把 i 取消引用后效果一样。
所以说,为啥引用会这么慢???
最终对比:
引用的 dinic 86分,非引用100分,快了非常多
怕发到 LOJ 没人看就发到这了