CF 331 E. Biologist

题目描述

题目大意:有\(n\)个点,初始时每个点为黑色或者白色,你可以花费\(v_i\)的代价将一个点反色。然后你有许多计划,每个计划要求一个点集中的所有点为同种颜色。满足了一个计划就可以得到\(w_i\)相应的价值,某些计划如果没有被满足,还会付出\(g\)的代价。

感觉这个题有点最大权闭合子图的样子,\(g\)的额外代价也很鸡肋。

然后我们考虑这道题的反色操作。如果第\(i\)个点本来是白色的,那么我们连\((S,i,v_i)\),否则连\((i,T,v_i)\)。如果将这种边割了,就代表将这个点反色。

然后对于第\(i\)个计划,如果他要求的点集为白色,但是点集中的点\(x\)为黑色,则我们连\((i+n,x,\infty)\);反之连\((x,i+n,\infty)\)。然后对于白色计划连\((S,i+n,w_i+[i==friend]*g)\);对于黑色计划连\((i+n,T,w_i+[i==friend]*g)\)。

如果\(S\to T\)有路径就代表有冲突了。

然后如果有不同颜色的计划的点集中有交,那么他们不可能同时选,于是连他们之间连一条\(\infty\)的边。然后我们可以优化一下这些边。

假设一个白色计划,它的点集中有白色点,那么我们也连\((i+n,x,\infty)\),黑色计划同理。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 15005 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n,m,g;
int col[N];
int v[N],fri[N],w[N];
int sex[N];
struct road {
int to,next;
int flow;
}s[N<<3];
int h[N],cnt=1;
int cur[N];
void add(int i,int j,int f) {
s[++cnt]=(road) {j,h[i],f};h[i]=cnt;
s[++cnt]=(road) {i,h[j],0};h[j]=cnt;
} int S,T;
int dis[N];
queue<int>q;
bool bfs() {
memset(dis,0x3f,sizeof(dis));
q.push(S);
dis[S]=0;
while(!q.empty()) {
int v=q.front();
q.pop();
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]>dis[v]+1) {
dis[to]=dis[v]+1;
q.push(to);
}
}
}
return dis[T]<1e9;
} int dfs(int v,int maxf) {
if(v==T) return maxf;
int ret=0;
for(int &i=cur[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]==dis[v]+1) {
int dlt=dfs(to,min(maxf,s[i].flow));
s[i].flow-=dlt;
s[i^1].flow+=dlt;
ret+=dlt;
maxf-=dlt;
if(!maxf) return ret;
}
}
return ret;
} int dinic() {
int ans=0;
while(bfs()) {
while(1) {
memcpy(cur,h,sizeof(h));
int tem=dfs(S,1e9);
if(!tem) break;
ans+=tem;
}
}
return ans;
}
int sum=0;
int main() {
n=Get(),m=Get(),g=Get();
T=n+m+1;
for(int i=1;i<=n;i++) col[i]=Get();
for(int i=1;i<=n;i++) {
v[i]=Get();
if(!col[i]) add(S,i,v[i]);
else add(i,T,v[i]);
}
for(int i=1;i<=m;i++) {
sex[i]=Get(),w[i]=Get();
sum+=w[i];
int k=Get();
while(k--) {
int a=Get();
if(sex[i]) add(a,i+n,1e9);
else add(i+n,a,1e9);
}
fri[i]=Get();
}
for(int i=1;i<=m;i++) {
if(sex[i]) add(i+n,T,w[i]+fri[i]*g);
else add(S,i+n,w[i]+fri[i]*g);
}
cout<<sum-dinic();
return 0;
}

CF 331 E. Biologist的更多相关文章

  1. 【CodeForces】【311E】Biologist

    网络流/最大权闭合图 题目:http://codeforces.com/problemset/problem/311/E 嗯这是最大权闭合图中很棒的一道题了- 能够1A真是开心-也是我A掉的第一道E题 ...

  2. CF 987

    毒瘤啊啊啊啊啊 虽然排名还不错,331,但是B我没做出来...... 这是战绩: 可以看到我大发神威势如破竹的A了CDE,但是B把我卡了三次...不然我就能进前300了(还是很水). 逐一分析题目: ...

  3. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

随机推荐

  1. Oracle 数据库导出数据泵(EXPDP)文件存放的位置

    数据泵是服务器端工具,导出的文件是放在数据库所在的服务器上,当然我们知道可以通过directory目录对象来控制.目录对象默认有四个级别,当然是有优先级顺序的,优先级从上往下 1.每个文件单独的指定具 ...

  2. Spring Boot Docker 实战

    Spring Boot Docker 开发环境 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_192 maven: ...

  3. Centos6.5安装Redis3.0备忘记录

    Centos6.5安装Redis3.0 1. 安装C编译环境 首先需要安装编译Redis的C环境,在命令行执行以下命令: [root@itzhouq32 tools] yum install gcc- ...

  4. Java 文件流操作.

    一.概念 在Java中,文件的输入和输出是通过流(Stream)来实现的.一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是 Internet 上的某个 URL.对 ...

  5. js 简单日历

    源地址:https://jingyan.baidu.com/article/546ae185fa4f721149f28cbf.htm 文件:index.htm <!DOCTYPE html> ...

  6. memcache 相关

    1.查看memcache是否启动 ps -ef | grep mem

  7. laravel表单验证

    效果展示:         代码 实现: 后台: use Validator; public function login() { if($input = Input::all()){ //验证提交的 ...

  8. 关于openSetting通过tap的调用

    问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本 API和组件 小程序 Bug openSetting 工具 6.7.2 2.3.0 - 当前 Bug 的表现(可附上截图 ...

  9. 浅谈Android 混淆和加固

    混淆: 针对项目代码,代码混淆通常将代码中的各种元素(变量.函数.类名等)改为无意义的名字,使得阅读的人无法通过名称猜测其用途,增大反编译者的理解难度. 虽然代码混淆可以提高反编译的门槛,但是对开发者 ...

  10. OkHttp的缓存

    看到很多小伙伴对OkHttp的缓存问题并不是十分了解,于是打算来说说这个问题.用好OkHttp中提供的缓存,可以帮助我们更好的使用Retrofit.Picasso等配合OkHttp使用的框架.OK,废 ...