题目大意

先放链接
简述一下:
有n个布尔变量,开始时分别是0或1。你可以改变这些变量,改变(0变1,1变0)第i个变量的代价是v[i]
现在有m个限制,形如a,b,x1,x2,x3…,xk,表示希望x1-xk都是a(a为0或1),都满足后可以获得b的价值
有一些限制如果没有满足要倒扣g的价值,g对于所有限制是一个相同的值
求最后能获得的最大价值

思路

一眼网络流
一个错误的思路:假设我们只考虑1,那么每个人到s连边,每个人到ta希望是1的连边,每个1(如果要改)向t连边。总和减最小割。但是这样无法考虑1和0。考虑使得1和0不能同时选(也不能同时不选),于是不能都不割,也不能都割,所以把是1和是0作为两个点,使他们在一个路径上。这样无法表示不满足某个限制。
想不粗来了qwq
于是注意到我们有一些条件没有用:每个限制一定是某些全是1/全是0,于是其实限制是两类
那么把变量放中间,希望是1的限制放在上面连s,希望是0的放下面连t,每个和他所限制的变量连边,这样可以保证每个点所构成的通路一定是一边(上边/下边)都被割了,这样可以表示最终是1/0
现在最后考虑改变变量的代价:假设这个变量最开始是1,那么我们希望这个代价是加在他不是1上的,就是加在他割去表示1那边的时候。那么我们让他割去1之后仍然联通,于是把他跟1那边的虚拟点联通(1的话就是s)。
于是我们解决了这个问题

总结

此题解法可以类比如何使得两个东西不能同时选,不能同时不选
注意观察题目是否有隐藏性质没有使用

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include <algorithm>
#include <queue>
#include <vector>
#define MAXN 10050
#define INF (1<<28)
using namespace std;
int s, t, n, m, g, sex[MAXN], v[MAXN], ans, level[MAXN<<3], q[MAXN<<3], cnt;
struct node{int v, c;node *next, *rev;
}pool[MAXN<<6], *h[MAXN<<4], *cur[MAXN<<4];
inline void addedge(int u, int v, int c){node *p1 = &pool[cnt++], *p2 = &pool[cnt++];*p1 = node{v, c, h[u], p2}, h[u] = p1;*p2 = node{u, 0, h[v], p1}, h[v] = p2;
}
// s 0 t 1
bool bfs(){int front = 0, rear = 1;memset(level, 0, sizeof(level));level[s] = 1;q[0] = s;while(front < rear){int u = q[front++];if(u == t) return 1;for(node *p = h[u]; p; p = p->next){if(!level[p->v] && p->c){q[rear++] = p->v;level[p->v] = level[u]+1;}}}return 0;
}
int dfs(int u, int t, int f){if(u == t) return f;int flow = 0, F, Min;for(node *&p = cur[u]; p; p = p->next){if(level[p->v] == level[u]+1 && p->c){Min = min(f-flow, p->c);F = dfs(p->v, t, Min);flow += F;p->c -= F;p->rev->c += F;if(flow == f) return flow;}}return flow;
}
int Dinic(){int ret = 0;while(bfs()){for(int i = s; i <= t; i++) cur[i] = h[i];ret += dfs(s, t, INF);}return ret;
}
int main(){scanf("%d%d%d", &n, &m, &g);t = n+m+1;int w, k, exp, fri, cur;for(int i = 1; i <= n; i++) scanf("%d", &sex[i]);for(int i = 1; i <= n; i++) scanf("%d", &v[i]);for(int i = 1; i <= m; i++) {scanf("%d%d%d", &exp, &w, &k);ans += w;for(int j = 1; j <= k; j++) {scanf("%d", &cur);if(exp) addedge(cur+m, i, INF);else addedge(i, cur+m, INF);}scanf("%d", &fri);w += g*fri;if(exp) addedge(i, t, w); else addedge(s, i, w);}for(int i = 1; i <= n; i++) {if(sex[i]) addedge(i+m, t, v[i]);else addedge(s, i+m, v[i]);} int cut = Dinic();//cout<<cut<<' ';ans -= cut;printf("%d", ans);return 0;
}

转载于:https://www.cnblogs.com/hychyc/p/9727468.html

【CF311E】biologist相关推荐

  1. 【CentOS】利用Kubeadm部署Kubernetes (K8s)

    [CentOS]利用Kubeadm部署Kubernetes (K8s)[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体实验流程 1 系统准 ...

  2. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  3. 【C#】类——里式转换

    类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...

  4. 【C#】Out与ref是干什么的?

    关于return: 1.最后没有写 return 语句的话,表示程序正常退出 2.不需要返回值时,存在return的作用 例子 void main() {return; //return退出该程序的作 ...

  5. 【软件工程】RUP与软件开发5大模型

    软件开发的5大模型 1.瀑布模型:按照人的思维一步一步的开发下去,如果需求分析得当,每个阶段顺利,结果还不错! 2.快速原型模型:后来人们发现,自己不可能一下子就把所有的需求搞清楚,总是在开发的过程中 ...

  6. 【VB】学生信息管理系统5——数据库代码

    这次学生信息管理系统在代码的理解过程中遇到了一些问题.总结如下: 1. sql server的安装过程各个步骤的意思.在安装SQL Server的时候按照网上的步骤,我觉得这个需要学完整个数据库再返回 ...

  7. 白化(预处理步骤)【转】

    白化(预处理步骤)[转] 介绍 我们已经了解了如何使用PCA降低数据维度.在一些算法中还需要一个与之相关的预处理步骤,这个预处理过程称为白化.举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很 ...

  8. 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积

    介绍 关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论: 1.Long J, Shelhamer E, Darrell T, et al. Fully convolutional networ ...

  9. 兑换量子计算机,阅读 | 【量子计算机】构造置换量子门

    原标题:阅读 | [量子计算机]构造置换量子门 量子计算机的一个基本组成单位叫量子门(quantum gate),下面简单介绍些基本概念. 量子比特和量子态 量子计算机的信息存储单元是一种叫做量子比特 ...

最新文章

  1. [推荐/译文/转]从底层角度看ASP.NET-A low-level Look at the ASP.NET Architecture
  2. 8月最新阿里技术栈架构资料
  3. php安全编程—sql注入攻击
  4. 若依微服务版前端怎样在接口返回500时去掉一直弹窗提示服务未找到
  5. 基于Qt\C++实现的网络远程控制系统
  6. 功放音量调节原理_玩汽车音响,功放和喇叭,应该如何做好匹配?
  7. android学习笔记---60_meta-data的使用,在清单文件中是用meta-data来给activity,service,receiver提供参数
  8. 【codevs5709】01背包
  9. 新买的Olmpus 7070,5.1照得几张照片
  10. 2017 校赛 问题 B: CZJ-Superman
  11. 矩阵分解在推荐系统中的应用:NMF和经典SVD实战
  12. Drools规则引擎简介
  13. java showtype_GitHub - kedarui/showapi_sdk_java: showapi_sdk_java
  14. python机器学习手写字体识别,机器学习之路: python 支持向量机 LinearSVC 手写字体识别...
  15. 系统坏了用u盘怎么重装系统
  16. JSON校验和JSON在线编辑器
  17. c语言中打印ipv6地址,IPv6地址介绍
  18. pip install pyinstaller安装报错
  19. word点击退出时未保存怎么办?
  20. 疯狂的程序员-第二十三章

热门文章

  1. 史上最实用mysql参数之一-----sql_safe_updates
  2. rsycn定时同步/备份异地主机文件
  3. 有り様、状態、様子 の 区別
  4. php asort,PHP asort() 函数
  5. 编程小白入门分享三:Spring AOP统一异常处理
  6. facebook开源的prophet时间序列预测工具---识别多种周期性、趋势性(线性,logistic)、节假日效应,以及部分异常值
  7. 使用Python迭代字符串中的每个字符
  8. 什么是在Vim中评论/取消注释行的快速方法?
  9. 如何禁用Web表单字段/输入标签上的浏览器自动完成功能?
  10. win11如何设置并排显示窗口 windows设置并排显示窗口的方法步骤