费用流+线性规划

搞了很长时间。。。

我们可以设立式子,a[1]+a[2]+a[3]+...+a[n]<=k , ... , a[2 * n + 1]+ ... +a[3*n]<=k

a是指该位有没有选

那么我们添加一个辅助变量f

a[1]+a[2]+a[3]+...+a[n]+f[1]=k,

...

a[2*n+1]+...+a[3*n]+f[2*n+1]=k

我们就得到了2n+1个式子

然后我们添加两个式子a(0):0=0 a(2*n+2):0=0

然后差分得到2n+2个式子,后一个式子减前一个式子

0:a[1]+a[2]+...+a[n]+f[1]=k

1:a[2]+...+a[n+1]+f[2]-a[1]-...-a[n]-f[1]=0->a[n+1]+f[2]-a[1]-f[1]=0

2:a[n+2]+f[3]-a[2]-f[2]=0

...

2n+1:a[3*n]+f[2*n+1]-a[2*n]-f[2*n]

2n+2:a[2n+1]+...+a[3*n]+f[2*n+1]=k

然后这个式子很像网络流的流量平衡,于是这样建图,正对负,负对正,因为第0项是a[1]+...+a[n],所以0->[1,n],因为都是这样形式的a[n+1]+f[2]-a[1]-f[1],-a[1]和+a[1]对应,因为a∈[0,1],所以流量为1,a[i]=1是指选了a[i],所以费用为a[i]

i-1->i,因为相邻两项-f[i],+f[i],f[i]∈[0,k],因为是辅助变量,所以什么都没有对应,流量为k,费用为0

后面类似 然后就建好图了 设立源汇和1n相连,流量为k 感觉理解不够深刻 碰见这种序列+限制的题可以用费用流做,先把限制代数化,然后-+连边,一般还会相邻的点之间连边,这样可以解决一些序列的问题,以后碰见再做

#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 0x3f3f3f3f;
struct edge {
int nxt, to, f, c;
} e[N * ];
int n, m, k, source, sink, tot, cnt = , sum;
int a[N], head[N], d[N], pree[N], prev[N], vis[N], live[N], dead[N], day[N], c[N], l[N], p[N];
inline void link(int u, int v, int f, int c)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].f = f;
e[cnt].to = v;
e[cnt].c = c;
}
inline void insert(int u, int v, int f, int c)
{
link(u, v, f, c);
link(v, u, , -c);
}
bool spfa()
{
memset(d, -, sizeof(d));
d[source] = ;
queue<int> q;
q.push(source);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && (d[e[i].to] < d[u] + e[i].c || d[e[i].to] == -))
{
pree[e[i].to] = i;
prev[e[i].to] = u;
d[e[i].to] = d[u] + e[i].c;
if(vis[e[i].to] == )
{
q.push(e[i].to);
vis[e[i].to] = ;
}
}
}
return d[sink] != -;
}
inline int Edmonds_Karp()
{
int ans = ;
while(spfa())
{
int now = sink, delta = inf;
while(now != source)
{
delta = min(delta, e[pree[now]].f);
now = prev[now];
}
now = sink;
while(now != source)
{
e[pree[now]].f -= delta;
e[pree[now] ^ ].f += delta;
now = prev[now];
}
ans += delta * d[sink];
}
return ans;
}
int main()
{
scanf("%d%d", &n, &k);
for(int i = ; i <= * n; ++i) scanf("%d", &a[i]);
source = * n + ;
sink = * n + ;
int s = , t = * n + ;
insert(source, s, k, );
insert(t, sink, k, );
sink = * n + ;
for(int i = ; i <= n; ++i) insert(s, i, , a[i]);
for(int i = ; i <= * n + ; ++i) insert(i - , i, k, );
for(int i = n + ; i <= * n; ++i) insert(i, t, , a[i + n]);
for(int i = n + ; i <= * n; ++i) insert(i - n, i, , a[i]); /* for(int i = 1; i <= 2 * n + 1; ++i) insert(i - 1, i, k, 0);
for(int i = 1; i <= n; ++i)
{
insert(s, i, 1, a[i]);
insert(i, i + n, 1, a[i + n]);
insert(i + n, t, 1, a[i + 2 * n]);
} */
printf("%d\n", Edmonds_Karp());
return ;
}

bzoj3550的更多相关文章

  1. BZOJ3550 [ONTAK2010]Vacation 【单纯形】

    题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...

  2. BZOJ3550: [ONTAK2010]Vacation

    3550: [ONTAK2010]Vacation Time Limit: 10 Sec  Memory Limit: 96 MBSubmit: 91  Solved: 71[Submit][Stat ...

  3. bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)

    传送门 直接暴力把线性规划矩阵给打出来然后单纯形求解就行了 简单来说就是每个数记一个\(d_i\)表示选或不选,那么就是最大化\(\sum d_ic_i\),并满足一堆限制条件 然后不要忘记限制每个数 ...

  4. bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线

    学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...

  5. [BZOJ3550] [Sdoi2014]数数

    Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...

  6. 【Richard 的刷(水)题记录】

    大概想了想,还是有个记录比较好. 9/24 网络流一日游: 最大流:bzoj1711[Usaco2007 Open]Dining 拆点 BZOJ 3993 Sdoi2015 星际战争 二分 P.S.这 ...

随机推荐

  1. 02Oracle Database 安装,卸载,系统服务,系统组件及系统表空间

    Oracle Database 安装,卸载,系统服务,系统组件及系统表空间 Oracle Database 安装 Oracle Database 卸载 Oracle Database 系统服务 Ora ...

  2. spring boot+mybatis+mysql增删改查分页

    server: port: servlet: context-path: /springBootMybatis spring: datasource: name: test url: jdbc:mys ...

  3. UVA-1368 DNA Consensus String(思路)

    题目: 链接 题意: 题目虽然比较长,但读完之后题目的思路还是比较容易想出来的. 给出m个长度为n的字符串(只包含‘A’.‘T’.‘G’.‘C’),我们的任务是得出一个字符串,要求这个字符串与给出的m ...

  4. NFV

    转载: NFV介绍定义:NFV,即网络功能虚拟化,Network Function Virtualization.通过使用x86等通用性硬件以及虚拟化技术,来承载很多功能的软件处理.从而降低网络昂贵的 ...

  5. shell日志颜色处理

    记录一下shell日志颜色处理 _COLORS=${BS_COLORS:-$(tput colors >/dev/)} __detect_color_support() { # shellche ...

  6. linux find-在指定目录下查找文件

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find ...

  7. python正则表达式提取字符串

    用python正则表达式提取字符串 在日常工作中经常遇见在文本中提取特定位置字符串的需求.python的正则性能好,很适合做这类字符串的提取,这里讲一下提取的技巧,正则表达式的基础知识就不说了,有兴趣 ...

  8. 洛谷 2048 BZOJ 2006 [NOI2010]超级钢琴

    [题解] 贪心题.设五元组(mx,pos,l,r1,r2)表示最大值为mx,取得最大值的区间右端点为pos,区间左端点为l,区间右端点的可选区间为[r1,r2]. 每次从堆里拎出最大值,然后把这个区间 ...

  9. 浅谈对java-GC的理解

    前段时间,一个线上项目忽然很卡,通过监控,发现内存很高,果不其然在几个小时后,OOM.虽说有人很快处理好了.但我还是想站在我的角度,对这件事发表一下自己的观点. 内存溢出,多发生在项目上线后,而且在系 ...

  10. 【Codeforces 1096D】Easy Problem

    [链接] 我是链接,点我呀:) [题意] 让你将一个字符串删掉一些字符. 使得字符串中不包含子序列"hard" 删掉每个字符的代价已知为ai 让你求出代价最小的方法. [题解] 设 ...