一眼最小割。

一种比较好想的建图方式如下:

连源点表示学文,连汇点表示学理,然后adde(S,id(i,j),a[i][j]),adde(id(i,j),T,b[i][j]);对于相邻座位选择同一科的情况,建立新节点,然后若学文,则新点向T连一条流量为价值的边,然后两名同学向该点连接流量为inf的边。学理也是类似的。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define FOR(x,y) for(int i=1;i<=x;i++)for(int j=1;j<=y;j++)
const int N=,M=3e5+;
using namespace std;
int n,m,T,cnt,tot,ans,hd[N],lv[N],q[N],v[M],nxt[M],w[M];
void adde(int x,int y,int z)
{
v[++cnt]=y,w[cnt]=z,nxt[cnt]=hd[x],hd[x]=cnt;
v[++cnt]=x,w[cnt]=,nxt[cnt]=hd[y],hd[y]=cnt;
}
bool bfs()
{
int qs=,qe=;
memset(q,,sizeof q);
memset(lv,,sizeof lv);
q[]=,lv[]=;
while(qs<qe)
{
int u=q[qs++];
if(u==T)break;
for(int i=hd[u];i;i=nxt[i])
if(w[i]&&!lv[v[i]]){lv[v[i]]=lv[u]+;q[qe++]=v[i];}
}
if(lv[T])return ;return ;
}
int dfs(int u,int low)
{
if(u==T||!low)return low;
int sum=;
for(int i=hd[u];i;i=nxt[i])
if(w[i]&&lv[v[i]]==lv[u]+)
{
int tmp=dfs(v[i],min(w[i],low));
sum+=tmp,low-=tmp,w[i]-=tmp,w[i^]+=tmp;
if(!low)return sum;
}
if(low)lv[u]=-;
return sum;
}
int id(int x,int y){return(x-)*m+y;}
int main()
{
scanf("%d%d",&n,&m);
T=*n*m+,cnt=,tot=n*m;
int x;
FOR(n,m)scanf("%d",&x),adde(,id(i,j),x),ans+=x;
FOR(n,m)scanf("%d",&x),adde(id(i,j),T,x),ans+=x;
FOR(n-,m)
scanf("%d",&x),tot++,adde(,tot,x),adde(tot,id(i,j),1e9),adde(tot,id(i+,j),1e9),ans+=x;
FOR(n-,m)
scanf("%d",&x),tot++,adde(tot,T,x),adde(id(i,j),tot,1e9),adde(id(i+,j),tot,1e9),ans+=x;
FOR(n,m-)
scanf("%d",&x),tot++,adde(,tot,x),adde(tot,id(i,j),1e9),adde(tot,id(i,j+),1e9),ans+=x;
FOR(n,m-)
scanf("%d",&x),tot++,adde(tot,T,x),adde(id(i,j),tot,1e9),adde(id(i,j+),tot,1e9),ans+=x;
while(bfs())ans-=dfs(,1e9);
printf("%d",ans);
}

bzoj2127happiness(最小割)的更多相关文章

  1. BZOJ2127happiness——最小割

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  2. BZOJ-2127-happiness(最小割)

    2127: happiness(题解) Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1806  Solved: 875 Description 高一 ...

  3. BZOJ2132 圈地计划 【最小割】

    题目 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解, 这块土地是一块矩形的区域,可以纵横划分 ...

  4. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  7. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  8. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

  9. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

随机推荐

  1. Codeforces 405E DFS

    这个题目要求把一个无向连通图里面的所有边,分成 两个一对,只能出现一次,而且一对边必须是连在一起的,点可以复用  但边不可复用 可解条件很易得,因为图是连通的,只要边数为偶数即可. 一开始我借着做欧拉 ...

  2. The 2019 China Collegiate Pro gramming Contest Harbin Site (F. Fixing Banners)

    F. Fixing Banners time limit per test 1 second memory limit per test 512 megabytes input standard in ...

  3. POJ - 3662 Telephone Lines (dijstra+二分)

    题意:有N个独立点,其中有P对可用电缆相连的点,要使点1与点N连通,在K条电缆免费的情况下,问剩下的电缆中,长度最大的电缆可能的最小值为多少. 分析: 1.二分临界线(符合的情况的点在右边),找可能的 ...

  4. python类(4)——自己造第一个轮子

    先做简单版本,再一步步增加功能 1.简单目的:要实现这样一个功能,能够连接服务器,登录账号,查询账号委托信息,如果有委托信息,撤销委托. 属性(不同账户之间差别):账户,密码 方法(不同账户之间都要用 ...

  5. 18 12 26 css 学习 选择器

    1.标签选择器 标签选择器,此种选择器影响范围大,建议尽量应用在层级选择器中.举例: *{margin:0;padding:0} div{color:red} <div>....</ ...

  6. pyecharts绘制地图可视化

    pyecharts:官方文档 我们这里使用pyecharts模块进行绘图. pyecharts 项目包含了一系列的地理地图数据,这些数据或者已经内置,或者需要额外安装和加载,我们需要下载下面六个包. ...

  7. 对CI框架中几个文件libraries

    对CI框架中几个文件libraries,helpers,hooks夹说明 来源:未知    时间:2014-10-20 11:37   阅读数:117   作者:xbdadmin [导读] 1.lib ...

  8. HDU 2795 Billboard 线段树活用

    题目大意:在h*w 高乘宽这样大小的 board上要贴广告,每个广告的高均为1,wi值就是数据另给,每组数组给了一个board和多个广告,要你求出,每个广告应该贴在board的哪一行,如果实在贴不上, ...

  9. 程序中出现list assignment index out of range的解决方法

    class stack: def __init__(self): self.num = 0 self.elem=[] def isEmoty(self): if self.num == 0: prin ...

  10. python刷LeetCode:2.两数相加

    难度等级:中等 题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返 ...