本道题共 4 个数据点,其中数据点 1,2,3 存在一定程度的卡常(也可能是图决定 dinic 复杂度较高)。
因此,如果你的前三个点 TLE,请确保你的 Dinic 中 dfs 部分存在一定程度的剪枝优化。
包括但不限于:
int dfs(int u,int in,int s,int t){
if(u==t)return in;
int out=0;
for(int i=head[u];i;i=edge[i].nxt){
if(edge[i].flow==0)continue;
int v=edge[i].to;
if(dis[v]==dis[u]+1){
int k=dfs(v,min(in,edge[i].flow),s,t);
in-=k;
out+=k;
edge[i].flow-=k;
edge[i^1].flow+=k;
if(in==0)break;
}
}
if(out==0)dis[u]=0;
return out;
}
这种方法能有 4∼5 倍的速度优化,足以通过此题。
此外,还可以通过在到达 v 后如果没有流就关掉这个点(深度变为 0) 的方法(虽然效率远不及第一个方法)。
同时,我不建议加入当前弧优化,因为在写不好时这是个负优化(这点存疑,可能是我写挂了)。