关于Dinic模板的那些事
  • 板块学术版
  • 楼主WrongAnwser
  • 当前回复12
  • 已保存回复12
  • 发布时间2020/9/11 21:40
  • 上次更新2023/11/5 13:23:56
查看原帖
关于Dinic模板的那些事
109801
WrongAnwser楼主2020/9/11 21:40

刚刚一个学妹学网络流跑过来问我, 李煜东的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

2020/9/11 21:40
加载中...