摘要: 如果不允许转化'#'和'.'的话,那么可以直接在'#'和'.'之间连容量为b的边,把所有'#'和一个源点连接,所有'.'和一个汇点连接,流量不限,那么割就是建围栏(分割'#'和'.')的花费。问题是'#'和'.'是可以转化的,由刚才的思路,可以联想到,当'#'可以转化成'.'的时候,那么就不需要在它... 阅读全文
posted @ 2015-08-26 22:49 陈瑞宇 阅读(1397) 评论(1) 推荐(0) 编辑
摘要: 路径的花费和时间有关,路径的开关是周期性的,那么只要计算出当前时间,路径距离关闭还剩下的时间,如果大于t,那么可以通过,否则,只能等到下一次。如果下一次也不能通过,即t>a,这样的边应该在输入的时候忽略。每次只要考虑,到达某个点的最短时间,因为如果等待,解不会更优。#includeusing nam... 阅读全文
posted @ 2015-08-26 17:39 陈瑞宇 阅读(590) 评论(0) 推荐(0) 编辑
摘要: 恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图,把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配。写的费用流。。最大权完美匹配KM算法没看懂#includeusing namespace std;const int maxn = 200+6;s... 阅读全文
posted @ 2015-08-26 16:35 陈瑞宇 阅读(282) 评论(0) 推荐(0) 编辑
摘要: Floyd的变形,本质是动态规划,路径分成的两个部分中取最大值作为该路径的答案,在所有可行路径之中选一个最小值。#includeusing namespace std;const int maxn = 101;int d[maxn][maxn];const int INF = 0x3f3f3f3f;... 阅读全文
posted @ 2015-08-26 15:12 陈瑞宇 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。#includeusing namespace std;typedef long long ll;const int m... 阅读全文
posted @ 2015-08-26 15:12 陈瑞宇 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈。#includeusing namespace std;const int maxn = 25;map mp;map::iterator it;vector names;bool d[maxn][maxn];int ID... 阅读全文
posted @ 2015-08-26 15:11 陈瑞宇 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 很经典的网络流模型,行编号和列编号分别看成一个点,行和列和分别看出容量,一个点(x,y)看出是一条边,边的容量下界是1,所以先减去1,之后在加上就好了。建图的时候注意分配好编号,解从残留网络中的边找。前向星建图的话,打印解会比较麻烦。#includeusing namespace std;const... 阅读全文
posted @ 2015-08-26 11:50 陈瑞宇 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点。dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Testcase最后一个不要换行,没有testcase最后一个要加换行,想起那天gold miner PE... 阅读全文
posted @ 2015-08-26 00:25 陈瑞宇 阅读(178) 评论(0) 推荐(0) 编辑