问题描述

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 文理分科 新建点最小割的更多相关文章

  1. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  2. D - 文理分科 HYSBZ - 3894(最小割)

    题目链接:https://cn.vjudge.net/contest/281959#problem/D 题目大意:中文题目 具体思路: 首先说一下最小割:在最小代价的前提下,删除一些边之后,能够使得整 ...

  3. BZOJ 3894 / Luogu P4313 文理分科 (拆点最小割)

    题面 中文题面- BZOJ 传送门 Luogu 传送门 分析 这道题类似于BZOJ 3774 最优选择,然后这里有一篇博客写的很好- Today_Blue_Rainbow's Blog 应该看懂了吧- ...

  4. 【BZOJ3894】文理分科(最小割)

    [BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...

  5. 【BZOJ3894】文理分科 最小割

    [BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...

  6. 【bzoj3894】文理分科 网路流

    [bzoj3894]文理分科 2015年3月25日3,4002 Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班 ...

  7. 【bzoj3894】文理分科 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...

  8. BZOJ3894:文理分科——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...

  9. BZOJ2127/LG1646 happiness 新建点最小割

    问题描述 BZOJ2127 LG1646 题解 和文理分科差不多 收益最大 -> 损失最小 -> 最小割 分别新建点表示互相关系就行了 \(\mathrm{Code}\) #include ...

随机推荐

  1. iSensor APP 之 摄像头调试 OV9655 测试之二

    参考上一篇博客 iSensor APP 之 摄像头调试 OV9655 本次链接主要介绍,使用ov9655输出QVGA格式,320*240  YUV输出,图像效果还不错,用户可以参考此模板改变分辨率,不 ...

  2. MySQL 05

    目录 事务 基本概念 四大特性(ACID) 使用方法 存储引擎 视图 基本概念 使用方法 触发器 基本概念 使用方法 存储过程 基本概念 使用方法 数据备份 备份 导入 函数 事务 基本概念 事务: ...

  3. JavaScript数组去重(12种方法,史上最全)

    参考博客:https://segmentfault.com/a/1190000016418021?utm_source=tag-newest

  4. 1篇文章搞清楚8种JVM内存溢出(OOM)的原因和解决方法

    前言 撸Java的同学,多多少少会碰到内存溢出(OOM)的场景,但造成OOM的原因却是多种多样. 堆溢出 这种场景最为常见,报错信息: java.lang.OutOfMemoryError: Java ...

  5. 4种MySQL分页查询优化的方法,你知道几个?

    前言 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的 ...

  6. 《Java基础知识》Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  7. 创建基于ASP.NET core 3.1 的RazorPagesMovie项目(一)-创建和使用默认的模板

    声明:参考于asp.net core 3.1 官网(以后不再说明) 本教程是系列教程中的第一个教程,介绍生成 ASP.NET Core Razor Pages Web 应用的基础知识. 在本系列结束时 ...

  8. C# DataTable to List<T> based on reflection.

    From https://www.cnblogs.com/zjbky/p/9242140.html static class ExtendClass { public static List<T ...

  9. IT兄弟连 HTML5教程 CSS3属性特效 小结及习题

    本章小结 CSS3新增了许多属性,CSS3样式新增了一种颜色模式rgba用来制作透明色,比CSS的颜色模式多了一个透明度的设置.文字的CSS3特效有文字阴影.文字描边.文字排版和文字省略等.另外,CS ...

  10. BearerToken之JWT的介绍

    Bearer认证 HTTP提供了一套标准的身份验证框架:服务器可以用来针对客户端的请求发送质询(challenge),客户端根据质询提供身份验证凭证.质询与应答的工作流程如下:服务器端向客户端返回40 ...