Codeforces 311E Biologist
Discription
SmallR is a biologist. Her latest research finding is how to change the sex of dogs. In other words, she can change female dogs into male dogs and vice versa.
She is going to demonstrate this technique. Now SmallR has n dogs, the costs of each dog's change may be different. The dogs are numbered from 1 to n. The cost of change for dog i is vi RMB. By the way, this technique needs a kind of medicine which can be valid for only one day. So the experiment should be taken in one day and each dog can be changed at most once.
This experiment has aroused extensive attention from all sectors of society. There are m rich folks which are suspicious of this experiment. They all want to bet with SmallR forcibly. If SmallR succeeds, the i-th rich folk will pay SmallR wi RMB. But it's strange that they have a special method to determine whether SmallR succeeds. For i-th rich folk, in advance, he will appoint certain ki dogs and certain one gender. He will think SmallR succeeds if and only if on some day the ki appointed dogs are all of the appointed gender. Otherwise, he will think SmallR fails.
If SmallR can't satisfy some folk that isn't her friend, she need not pay him, but if someone she can't satisfy is her good friend, she must pay g RMB to him as apologies for her fail.
Then, SmallR hope to acquire money as much as possible by this experiment. Please figure out the maximum money SmallR can acquire. By the way, it is possible that she can't obtain any money, even will lose money. Then, please give out the minimum money she should lose.
Input
The first line contains three integers n, m, g (1 ≤ n ≤ 104, 0 ≤ m ≤ 2000, 0 ≤ g ≤ 104). The second line contains n integers, each is 0 or 1, the sex of each dog, 0 represent the female and 1 represent the male. The third line contains n integers v1, v2, ..., vn (0 ≤ vi ≤ 104).
Each of the next m lines describes a rich folk. On the i-th line the first number is the appointed sex of i-th folk (0 or 1), the next two integers are wi and ki (0 ≤ wi ≤ 104, 1 ≤ ki ≤ 10), next ki distinct integers are the indexes of appointed dogs (each index is between 1 and n). The last number of this line represents whether i-th folk is SmallR's good friend (0 — no or 1 — yes).
Output
Print a single integer, the maximum money SmallR can gain. Note that the integer is negative if SmallR will lose money.
Example
5 5 9
0 1 1 1 0
1 8 6 2 3
0 7 3 3 2 1 1
1 8 1 5 1
1 0 3 2 1 4 1
0 8 3 4 2 1 0
1 7 2 4 1 1
2
5 5 8
1 0 1 1 1
6 5 4 2 8
0 6 3 2 3 4 0
0 8 3 3 2 4 0
0 0 3 3 4 1 1
0 10 3 4 3 1 1
0 4 3 3 4 1 1
16 题目大意就是有N个点,每个点一开始是黑色或者白色,把i点的颜色翻转需要v[i]的代价。
同时还有M个计划,每个计划要求计划内的点全黑或者全白,如果满足会得到l[i]的收益,
但是如果这个计划是朋友的而且没有被满足的话是需要付出g的代价的,其中g是题目中给定的常数。
求最大收益。 这是一个经典的最大权闭合子图的集合划分问题。
首先我们要把答案设置成所有可能得到的收益,然后再减去最少可能付出的代价。
而求这个最少可能付出的代价就是一个网络流的最小割问题。 本题中,我们把每个白点连S,黑点连T,容量为v[i],代表转换颜色的代价。
类似的,把每个白计划连S,黑计划连T,容量为l[i]+(该计划是否是朋友的?g:0),
代表舍弃这个计划的代价。 对于每个计划,如果计划中的一个节点的初始颜色和计划要求的颜色不一样,
那么把计划和该点连边,容量为inf,表示要么舍弃这个计划,要么让计划涉及的
异色节点全部翻转。 光这样还不行,因为可能一个点在某个计划中翻转了,而在另一个计划中不需要翻转。
所以我们最后需要把有冲突的计划连边,容量为inf,表示这两个计划不能同时选择。 然后就可以直接求解了。
# | JYYHH's solution for [CodeForces-311E] Status Time Memory Length Lang
Accepted 31ms 13256kB GNU G++ 5.1. Submitted
-- ::
Shared #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#define ll long long
#define pb push_back
#define maxn 20005
using namespace std;
const int inf=<<;
vector<int> g[maxn];
struct lines{
int to,flow,cap;
}l[maxn*];
int n,m,G,S,T,t=-,cur[maxn];
int d[maxn],kk,val;
bool v[maxn]; inline void add(int xx,int yy,int zz){
l[++t]=(lines){yy,,zz},g[xx].pb(t);
l[++t]=(lines){xx,,},g[yy].pb(t);
} inline bool bfs(){
queue<int> q;
memset(v,,sizeof(v));
d[S]=,v[S]=,q.push(S); int x; lines e;
while(!q.empty()){
x=q.front(),q.pop();
for(int i=g[x].size()-;i>=;i--){
e=l[g[x][i]];
if(!v[e.to]&&e.flow<e.cap){
d[e.to]=d[x]+;
v[e.to]=;
q.push(e.to);
}
}
} return v[T];
} int dfs(int x,int a){
if(x==T||!a) return a;
int flow=,f,sz=g[x].size();
for(int &i=cur[x];i<sz;i++){
lines &e=l[g[x][i]];
if(d[x]==d[e.to]-&&(f=dfs(e.to,min(a,e.cap-e.flow)))){
flow+=f,a-=f;
e.flow+=f,l[g[x][i]^].flow-=f;
if(!a) break;
}
} return flow;
} inline int max_flow(){
int an=;
while(bfs()){
memset(cur,,sizeof(cur));
an+=dfs(S,inf);
}
return an;
} int tp[maxn],now,opt[maxn];
int tot,pos,ooOOooOOoo;
vector<int> bel[maxn]; int main(){
scanf("%d%d%d",&n,&m,&G); S=,T=n+m+;
for(int i=;i<=n;i++) scanf("%d",tp+i);
for(int i=;i<=n;i++){
scanf("%d",&now);
//白点连S,黑点连T,容量含义为转变颜色的代价
if(tp[i]) add(i,T,now);
else add(S,i,now);
} for(int i=;i<=m;i++){
scanf("%d%d%d",opt+i,&val,&kk); while(kk--){
scanf("%d",&pos);
if(opt[i]^tp[pos]){
//白计划连黑点,白点连黑计划,不能同时选择
if(opt[i]) add(pos,n+i,inf);
else add(n+i,pos,inf);
}
bel[pos].pb(i);
} //白计划连S,黑计划连T,容量含义为该计划不被满足的代价(g+val)
tot+=val,scanf("%d",&ooOOooOOoo);
if(ooOOooOOoo) val+=G;
if(opt[i]) add(n+i,T,val);
else add(S,n+i,val);
} //注意涉及同一个点的白计划和黑计划也不能共存
for(int i=;i<=n;i++){
int sz=bel[i].size(),to1,to2;
for(int j=;j<sz;j++){
to1=bel[i][j];
for(int u=j+;u<sz;u++){
to2=bel[i][u];
if(opt[to1]^opt[to2]){
if(opt[to1]) add(to2+n,to1+n,inf);
else add(to1+n,to2+n,inf);
}
}
}
} cout<<tot-max_flow()<<endl;
return ;
}
Codeforces 311E Biologist的更多相关文章
- 【CodeForces】【311E】Biologist
网络流/最大权闭合图 题目:http://codeforces.com/problemset/problem/311/E 嗯这是最大权闭合图中很棒的一道题了- 能够1A真是开心-也是我A掉的第一道E题 ...
- Codeforces 311.E Biologist
E. Biologist time limit per test 1.5 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Codeforces Round #484 (Div. 2) D. Shark
Codeforces Codeforces Round #484 (Div. 2) D. Shark 题目连接: http://codeforces.com/contest/982/problem/D ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- 【BZOJ 3123】 [Sdoi2013]森林 主席树启发式合并
我们直接按父子关系建主席树,然后记录倍增方便以后求LCA,同时用并查集维护根节点,而且还要记录根节点对应的size,用来对其启发式合并,然后每当我们合并的时候我们都要暴力拆小的一部分重复以上部分,总时 ...
- git使用笔记(八)团队协作
By francis_hao Nov 24,2016 本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可.欢迎转载,请注明出处 ...
- 封装安卓的okhttp
1.封装了get方法,handler更新主线程,回调的onsuccess,onfailure,onerror等方法 2.配置文件 api 'com.android.support:recyclervi ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- 动态规划:状压DP
状压DP可以用在NP问题的小规模求解中(不理解,感觉和可以搜索的题很类似) 如果状态是个网格,数据范围很小,基本锁定状压DP 例题是BZOJ1725 题意是这样的,给定一个黑白图,然后种田,要求田与田 ...
- algorithm ch15 FastWay
这是DP最基础的一个问题,刚开始学习这一块,实现了一下,不要黑我巨长的参数表,新手. 代码如下: void FastWay(int l1[], int l2[], int e1, int e2, in ...
- LeetCode the longest palindrome substring
回文检测,参考http://blog.csdn.net/feliciafay/article/details/16984031 使用时间复杂度和空间复杂度相对较低的动态规划法来检测,具体的做法 图一 ...
- IOS工程自动打包并发布脚本实现
http://blog.csdn.net/ccf0703/article/details/8588667 文章首发地址:http://webfrogs.me/2013/02/18/ios-automa ...
- POJ1458(最长公共子序列)
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44223 Accepted: 18 ...
- 【反演复习计划】【COGS2432】爱蜜莉雅的施法
也是一个反演. 第一次手动推出一个简单的式子,激动.jpg 原题意思是求:$Ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\phi(gcd(i,j))$随 ...