【bzoj3438】小M的作物 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend/p/6801522.html
题目描述
输入
输出
只有一行,包括一个整数,表示最大收益
样例输入
3
4 2 1
2 3 2
1
2 3 2 1 2
样例输出
11
题解
网络流最小割
最大收益=总收益-最小损失
最小损失可以通过最小割来求。
设与S相连表示种在A,与T相连表示种在B。
每个作物不能同时种在A和B,应选择一个割掉,故连边S->i,容量为ai;i->T,容量为bi。
对于每个组合,如果这个组合都种在A,那么任意一个都不能种在B,应割掉,故连边S->kai,容量为c1i;kai->p,容量为inf。
都种在B同理。
然后求最小割,用总收益减去最小割即为答案。
数组好像要开很大才能过。
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x7fffffff
using namespace std;
queue<int> q;
int head[3050] , to[4100000] , val[4100000] , next[4100000] , cnt = 1 , s , t , dis[3050];
void add(int x , int y , int z)
{
to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
}
bool bfs()
{
int x , i;
while(!q.empty()) q.pop();
memset(dis , 0 , sizeof(dis));
dis[s] = 1 , q.push(s);
while(!q.empty())
{
x = q.front() , q.pop();
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && !dis[to[i]])
{
dis[to[i]] = dis[x] + 1;
if(to[i] == t) return 1;
q.push(to[i]);
}
}
}
return 0;
}
int dinic(int x , int low)
{
if(x == t) return low;
int temp = low , i , k;
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && dis[to[i]] == dis[x] + 1)
{
k = dinic(to[i] , min(temp , val[i]));
if(!k) dis[to[i]] = 0;
val[i] -= k , val[i ^ 1] += k;
if(!(temp -= k)) break;
}
}
return low - temp;
}
int main()
{
int n , m , i , k , a , b , x , tot , sum = 0;
scanf("%d" , &n);
s = 0 , t = tot = n + 1;
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a) , add(s , i , a) , sum += a;
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &b) , add(i , t , b) , sum += b;
scanf("%d" , &m);
while(m -- )
{
scanf("%d%d%d" , &k , &a , &b);
add(s , ++tot , a) , add(++tot , t , b) , sum += a + b;
while(k -- ) scanf("%d" , &x) , add(tot - 1 , x , inf) , add(x , tot , inf);
}
while(bfs()) sum -= dinic(s , inf);
printf("%d\n" , sum);
return 0;
}
【bzoj3438】小M的作物 网络流最小割的更多相关文章
- BZOJ3438 小M的作物(最小割)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...
- BZOJ_3438_小M的作物_最小割
BZOJ_3438_小M的作物_最小割 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物) ...
- 「BZOJ3438」小M的作物(最小割
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1891 Solved: 801[Submit][Status][Discus ...
- 【洛谷1361】 小M的作物(最小割)
传送门 洛谷 Solution 这是一个比较实用的套路,很多题目都有用,而且这个套路难以口胡出来. 考虑把每一个附加贡献重新建一个点,然后向必需的点连边,流量为val. 然后直接种植的从源点向这个点连 ...
- 【bzoj3894】文理分科 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...
- 【bzoj3774】最优选择 网络流最小割
题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...
- 【bzoj2132】圈地计划 网络流最小割
题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...
- 【bzoj2127】happiness 网络流最小割
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
随机推荐
- 初探12C碰到的那些“坑”
一个昏天黑地的早上,刚搭建的系统忽然遭遇严重数据库问题.于是,主要人物闪亮登场了,他们分别是友商人员小灰和DBA小Y. 事情的开始,小Y接到小灰紧急救助电话... 小灰:小Y,我是友商的小灰,刚搭建的 ...
- Ajax跨域请求以及乱码解决
Ajax跨域请求2种解决方法 1 ) 什么叫跨域请求,协议,域名,端口号,其中一样不同都称跨域; 第一种:使用script标签发送请求; //创建一个script标签; var v_element=d ...
- C#基础-面向对象-继承
继承 新建一个基类 对Person类3个字段进行重构->封装字段 效果如下: public string Name { get => name; set => name = valu ...
- 银行卡验证API
一.银联开放平台 https://open.unionpay.com/tjweb/api/detail?apiSvcId=21 应用场景 综合数据服务平台是银联为接入商户提供的综合数据认证服务接口,目 ...
- JAVA / MySql 编程——第六章 Mysql 创建账户的相关命令
1. 创建普通用户: 语法: CREATE USER `user`@`host` [IDENTIFIED 'password']; //user:用户名,host:主机名,passw ...
- javascript遍历方法总结
forEach 循环 JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.lengt ...
- Java中使用webSocket
Java中使用webSocket package com.yaoqi.controller.message; import javax.websocket.*; import javax.websoc ...
- python网络爬虫入门范例
python网络爬虫入门范例 Windows用户建议安装anaconda,因为有些套件难以安装. 安装使用pip install * 找出所有含有特定标签的HTML元素 找出含有特定CSS属性的元素 ...
- python系列2之数据类型
目录 Python数据类型 python的运算符 Python的循环与判断语句 python练习 Python作业 一. Python的数据类型 1. 整型(int) <1>. 赋值 ...
- POJ:2367-Cleaning Shifts
传送门:http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Sub ...