在 [P4194] 矩阵 中,我的 Dinic 分别使用了如下的两段代码:
int dfs(int x, int flow) {
if(x == T) return flow;
int rest = flow;
for(int i = cur[x]; i && rest; i = edge[i].nxt) {
cur[x] = i;
int to = edge[i].to, w = edge[i].w;
if(w > 0 && dis[to] == dis[x] + 1) {
int k = dfs(to, min(rest, w));
rest -= k;
edge[i].w -= k;
edge[i ^ 1].w += k;
}
}
return flow - rest;
}
int dfs(int x, int flow) {
if(x == T) return flow;
int rest = flow;
for(int i = cur[x]; i; i = edge[i].nxt) {
cur[x] = i;
int to = edge[i].to, w = edge[i].w;
if(w > 0 && dis[to] == dis[x] + 1) {
int k = dfs(to, min(rest, w));
rest -= k;
edge[i].w -= k;
edge[i ^ 1].w += k;
}
}
return flow - rest;
}
说白了就是有没有剩余容量判断的差别。但是一个 TLE 40pts,一个 AC 151ms。
但是我听说剩余容量判断只是一个常数优化,所以这个 TLE 真的就是常数爆炸了吗?又或者我的 Dinic 写假了?
求大佬指点 qwq。