建模方法大概就是像网上其他人说的那样。。。可以看oyk的博客http://www.cnblogs.com/oyking/archive/2013/09/15/3323483.html
下面讨论一下为什么这样建模是对的:
一个点u属于k个简单环的话,那么在每个环里都有两条边连u,所以u共有2k条边。
考虑一个环中u的两条无向边,可以转换成两条有向边,一个进入u,一个从u出去。
那么对于一个u来说入度为k,出度为k。这样模型就出来了。按这个模型跑费用流后,每个点的入度出度都为k了。
再证u的入度出度都为k时,u属于k个简单环:
考虑u所属的联通分量,这个分量是联通的且每个点的入度等于出度,满足欧拉回路的条件。
那么肯定能够找到一个包含u的简单环,删掉这个简单环上的边后,再重复找环,共能找到k个简单环,得证。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
虽然知道大家基本上都是用zkw费用流过的但还是忍不住写一发。。。
写了一发普通的费用流。。。tle了。。。。
然后发现是稠密图,现学现写,搞了一发dijkstra增广的费用流。。。。tle了。。。把priority_queue换成手写的。。还是tle。。。预处理所有开方的答案。。。还是tle。。。。
仔细看了一下input。。。最大流量为5000,边数最多为100*100级别。。。要是增广10^3级别,每次消耗10^4级别不就tle了。。。
看了一眼zkw费用流的介绍,感觉正好能解决这个问题,于是就扒了oyk的zkw费用流模板下来。。。。843ms ac。。。
代码就不贴了。。。和oyk的代码实在是相似。。。。