BZOJ 3894 文理分科 最小割
题目大意:给定一个m*n的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和
令S集为学文,T集为学理
每个人学文或者学理的满意度很好连边
如果某个集合内的人都学理会获得一个满意度,那么就新加一个点,将集合内的所有人向这个点连流量为正无穷的边,再从这个点向T连一条流量为满意度的边,表示集合内任意一个人学文都要把这个点与T的边割掉
都学文同理
建完图之后跑最小割即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 30300
#define S 0
#define T 30299
#define INF 0x3f3f3f3f
#define P(i,j) ((i)*n-n+(j))
using namespace std;
const int dx[]={0,0,0,1,-1};
const int dy[]={0,1,-1,0,0};
int m,n,ans;
namespace Max_Flow{struct abcd{int to,f,next;}table[1001001];int head[M],tot=1;int dpt[M];void Add(int x,int y,int z){table[++tot].to=y;table[tot].f=z;table[tot].next=head[x];head[x]=tot;}void Link(int x,int y,int z){Add(x,y,z);Add(y,x,0);}bool BFS(){static int q[M];int i,r=0,h=0;memset(dpt,-1,sizeof dpt);dpt[S]=1;q[++r]=S;while(r!=h){int x=q[++h];for(i=head[x];i;i=table[i].next)if(table[i].f&&!~dpt[table[i].to]){dpt[table[i].to]=dpt[x]+1;q[++r]=table[i].to;if(table[i].to==T)return true;}}return false;}int Dinic(int x,int flow){int i,left=flow;if(x==T) return flow;for(i=head[x];i&&left;i=table[i].next)if(table[i].f&&dpt[table[i].to]==dpt[x]+1){int temp=Dinic(table[i].to,min(left,table[i].f) );table[i].f-=temp;table[i^1].f+=temp;left-=temp;}if(left) dpt[x]=-1;return flow-left;}
}
int main()
{int i,j,k,x;using namespace Max_Flow;cin>>m>>n;for(i=1;i<=m;i++)for(j=1;j<=n;j++){scanf("%d",&x);ans+=x;Link(S,P(i,j),x);}for(i=1;i<=m;i++)for(j=1;j<=n;j++){scanf("%d",&x);ans+=x;Link(P(i,j),T,x);}for(i=1;i<=m;i++)for(j=1;j<=n;j++){scanf("%d",&x);ans+=x;Link(S,P(i,j)+m*n,x);for(k=0;k<=4;k++){int xx=i+dx[k];int yy=j+dy[k];if(xx<=0||yy<=0||xx>m||yy>n)continue;Link(P(i,j)+m*n,P(xx,yy),INF);}}for(i=1;i<=m;i++)for(j=1;j<=n;j++){scanf("%d",&x);ans+=x;Link(P(i,j)+2*m*n,T,x);for(k=0;k<=4;k++){int xx=i+dx[k];int yy=j+dy[k];if(xx<=0||yy<=0||xx>m||yy>n)continue;Link(P(xx,yy),P(i,j)+2*m*n,INF);}}while( BFS() )ans-=Dinic(S,INF);cout<<ans<<endl;return 0;
}
BZOJ 3894 文理分科 最小割相关推荐
- bzoj 3894: 文理分科 最小割
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
- [BZOJ 3894]文理分科
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 729 Solved: 328 [Submit][Status][Discu ...
- BZOJ 3894 Luogu P4313 文理分科 (最小割)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...
- [BZOJ 3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同 ...
- 文理分科 (最小割问题)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学 ...
- LuoguP4313 BZOJ3894 文理分科——最小割
洛谷:文理分科 传送门 题目描述: 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学必须从文科和理科中选择一科.同学们在选择科目的时候会获得一 ...
- bzoj3894 文理分科 最小割
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
- BZOJ 3894 文理分科
题解:最小割建模 如果某些元素在一起会得到收益考虑最小割 答案 总收益-最小割 注意:对0点的处理 一开始模型是错的 #include<iostream> #include<cstd ...
- bzoj 3894: 文理分科
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
最新文章
- 在实习面试的过程的当中,常见的面试题(自己面试一路走来,所出现的频率较高的面试题总结)
- 硬科技凭什么产业化?
- Junit指定测试执行顺序
- 基于Mahout的电影推荐系统
- POJ-2976 Dropping tests 01分数规划
- 想入职AI算法岗?BAT的工程师去学了这门课
- 移植RTT使用cubeMx配置后出现 cannot open source input file stm32f1xx_hal_exti.h: No such file or directory
- sketch设置字体技巧(二)---通过组合法重新组建字体
- 解决XP的IIS HTTP 500”内部服务器错误
- JavaScript生成树形菜单(递归算法)
- bootstrap 响应式布局
- 安卓pdf阅读器_文石BOOX Nova3电子书阅读器到底值不值得买?Nava2老用户心得分享!(2020年双十一)...
- 第十一章 枚举与泛型 总结
- 访客预约管理4大难点,帮你逐一破解
- 【Hack The Box】linux练习-- SneakyMailer
- Android EditText简单自定义边框样式
- 【新手入门必看】git 和 github 介绍
- RS Meet DL(68)-建模多任务学习中任务相关性的模型MMoE
- HTTP状态信息和描述
- 信号完整性问题及其解决方法