摘要: 【题目大意】N个盒子围成一圈。第i个盒子初始时有Ai个小球(∑Ai1则连边(s,i,Ai-1,0);若Ai=0则连边(i,t,1,0)。对任意两个盒子i,j,若Ai>1并且Aj=0,连边(i,j,∞,min(|i-j|,n-|i-j|))。求一次最小费用流即为结果。但是这样构图复杂度会很高,边数会达到O(N^2),不够聪明。更加简洁的方法是直接由每个盒子向与其相邻的两个盒子连边(i,j,∞,1),总共也才2N条,将边数降到了O(N),由TLE变成AC。以上摘自Edelwiss《网络流建模汇总》其实一开始基本上不会往那个T的方向去想。总之还是每种方案会对应一条边。 1 #include 2 阅读全文
posted @ 2013-10-09 09:25 浙西贫农 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 这题的费用流模型应该很明显,已知从起点开始一共可以走k次,那么容量就有了。对每个点,把他拆成(i,i'),因为点上的权只能取一次,以后再经过这个点的时候,权值为0,所以这里就对应了两条边(i,i',1,-w),(i,i',k-1,0)。另外,对于所有i点能够到达的点j,对应一条边(i',j,k,0)。跑一遍最小费用流再取反即为结果。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 5010 6 #define maxm 100010 7 #define INF 1 Q;34 for(int i 阅读全文
posted @ 2013-10-09 08:59 浙西贫农 阅读(154) 评论(0) 推荐(0) 编辑