BZOJ3894/LG4313 文理分科 新建点最小割
问题描述
题解
显然一个人只能选文/理 -> 一个人只能属于文(S)、理(T)集合中的一个
可以把选择文得到 \(art\) 的收益看做选择文失去 \(science\) 的收益,也就是最小割了。
考虑如何处理周围人都选
对于文科,再新建一个 \((i,j)'\) ,从 S 向其连边,权值为 \(sameart\) ,再从 \((i,j)'\) 向 \((i,j)\) 和它周围的四个点连边,权值为INF,代表只有当这六个点都在集合 \(S\) 里的时候,才能不割掉 S 到 \((i,j)'\) 的连边,获得这个收益。
理科同理。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int S,T,n,m;
int art[507][507],science[507][507];
int artsame[507][507],sciencesame[507][507];
int Head[500*500*3+100],to[5000007],Next[5000007],w[5000007],tot=1;
void addedge(int x,int y,int z){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
}
void add(int x,int y,int z){
addedge(x,y,z);addedge(y,x,0);
}
int d[500*500*3+100];
bool bfs(void){
memset(d,0,sizeof(d));
queue<int>q;q.push(S);d[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(d[y]||!w[i]) continue;
d[y]=d[x]+1;q.push(y);
if(y==T) return true;
}
}
return false;
}
int dfs(int x,int flow){
if(x==T) return flow;
int rest=flow;
for(int i=Head[x];i&&rest;i=Next[i]){
int y=to[i];
if(d[y]!=d[x]+1||!w[i]) continue;
int k=dfs(y,min(rest,w[i]));
if(!k) d[y]=0;
else w[i]-=k,w[i^1]+=k,rest-=k;
}
return flow-rest;
}
int Dinic(void){
int res(0),t;
while(bfs()){
while(t=dfs(S,INF)) res+=t;
}
return res;
}
int total;
int dx[5]={0,0,1,-1,0};
int dy[5]={1,-1,0,0,0};
bool check(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m) return true;
return false;
}
int id(int x,int y,int id){
return (id-1)*n*m+(x-1)*m+y;
}
void Init(void){
scanf("%d%d",&n,&m);
S=n*m*3+1,T=S+1;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
scanf("%d",&art[i][j]);total+=art[i][j];
add(S,id(i,j,1),art[i][j]);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
scanf("%d",&science[i][j]);total+=science[i][j];
add(id(i,j,1),T,science[i][j]);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
scanf("%d",&artsame[i][j]);total+=artsame[i][j];
add(S,id(i,j,2),artsame[i][j]);
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
scanf("%d",&sciencesame[i][j]);total+=sciencesame[i][j];
add(id(i,j,3),T,sciencesame[i][j]);
}
for(int x=1;x<=n;x++){
for(int y=1;y<=m;y++){
for(int i=0;i<5;i++){
int nx=x+dx[i],ny=y+dy[i];
if(!check(nx,ny)) continue;
add(id(nx,ny,2),id(x,y,1),INF);
add(id(x,y,1),id(nx,ny,3),INF);
}
}
}
}
void Work(void){
int maxflow=Dinic();
printf("%d\n",total-maxflow);
}
int main(){
Init();
Work();
}
BZOJ3894/LG4313 文理分科 新建点最小割的更多相关文章
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- D - 文理分科 HYSBZ - 3894(最小割)
题目链接:https://cn.vjudge.net/contest/281959#problem/D 题目大意:中文题目 具体思路: 首先说一下最小割:在最小代价的前提下,删除一些边之后,能够使得整 ...
- BZOJ 3894 / Luogu P4313 文理分科 (拆点最小割)
题面 中文题面- BZOJ 传送门 Luogu 传送门 分析 这道题类似于BZOJ 3774 最优选择,然后这里有一篇博客写的很好- Today_Blue_Rainbow's Blog 应该看懂了吧- ...
- 【BZOJ3894】文理分科(最小割)
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
- 【BZOJ3894】文理分科 最小割
[BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- 【bzoj3894】文理分科 网路流
[bzoj3894]文理分科 2015年3月25日3,4002 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班 ...
- 【bzoj3894】文理分科 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...
- BZOJ3894:文理分科——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...
- BZOJ2127/LG1646 happiness 新建点最小割
问题描述 BZOJ2127 LG1646 题解 和文理分科差不多 收益最大 -> 损失最小 -> 最小割 分别新建点表示互相关系就行了 \(\mathrm{Code}\) #include ...
随机推荐
- 使用iCamera 测试AR0331 300w高分辨率摄像头小结
使用iCamera 测试AR0331 300w高分辨率摄像头小结 先看下sensor特性 分辨率最高可达:2048*1536=300w像素 1080p帧率最高可达60fps 本次使用usb2,帧率14 ...
- 基于iSensor的MT9M001C12STM传感器调试总结
iSensor APP 之 摄像头调试 MT9M001C12STM iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l OV7670.OV7725.OV9650.OV ...
- USB3.0 图像视频传输 开发 CYUSB3014开发基础(导入官方例程) 转
CYPREE提供的FX3_SDK开发包里面有很多基础的内容,除了前面提到的几个pdf文件外,还有三个文件夹,是官方提供的基础例程.学习CYUSB3014应该就从这里开始,从这几个例程开始.例程共有三个 ...
- python学习-os引入
# 引入import os # 路径处理 -- 外部资源-os # 获取当前的工作路径workspace = os.getcwd() # os模块下的getcwd函数print(workspace) ...
- Ubuntu修改时间
Ubuntu修改时区和更新时间 先查看当前系统时间 date -R 结果时区是:+0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 运行 tzselect 在这里我们选择亚洲 Asia, ...
- 《Javascript设计模式与开发实践》--读书笔记
第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...
- test-hellow world!
//for C #include<stdio.h> int main() { printf("hellow world!"); return 0; } #for pyt ...
- PMBOK 指南 第二章 项目运行环境
2.1概述 事业环境因素(EEF)源于项目外部(往往企业外部) 组织过程资产(OPA)源于企业内部 2.2 事业环境因素 项目团队不能控制 2.2.1 组织内部的事业环境因素 组织文化.结构和治理 设 ...
- Linux - CentOS 7 通过Yum源安装 MySql 5.7
添加MySQL Yum存储库 从官网下载最新的mysql源 官网地址:https://dev.mysql.com/downloads/repo/yum/ 选择并下载适用于平台的发行包. 然后,在Lin ...
- Angular 彻底解决 Dropdown 在 Safari 上无法自动关闭的问题
之前在 Safari 上用 focus 事件来实现 Dropdown 下拉菜单,结果在 iOS 上不兼容. 尝试了 MDN 和 stack over flow 上各种奇技淫巧,然而在 iOS 上全都败 ...