刚刚一个学妹学网络流跑过来问我, 李煜东的Dinic模板有一句话:
while (bfs())
while(flow = dinic(s, inf)) maxflow += flow;
她说这里为什么要写while
,我就给她说一遍dfs是跑不完的。后面我越想越奇怪,这个为什么跑不完呢?于是就有了下面这个提交:
关于我在咕站发贴却贴loj链接这回事
我在dfs的终止处加了个assert
:
if (p == t) { assert(!qaq); return flow; }
然后改了一下主函数:
maxflow_type dinic(void)
{
maxflow_type maxflow = 0;
memcpy(back, head, sizeof head);
while (bfs())
{
flow_type tmp = dfs(s, DfsValue);
maxflow += tmp;
qaq = true; //!!!这里
maxflow += dfs(s, DfsValue);
qaq = false;
memcpy(head, back, sizeof head);
}
return maxflow;
}
然后,AC了...
除了最大流是long long
,dfs传的flow是int
这种解释以外,我找不到其他解释了。
亦或是,根本就不需要这个while
?