题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2127

题解:

和 BZOJ 3984 建图类似(最小割模型)。
但是这个建图方法效率有点低。
另外这里这个解法比较高效,写得很好很清晰:
http://blog.csdn.net/hzj1054689699/article/details/53038620

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 65000
#define MAXM 300000
#define INF 0x3f3f3f3f
using namespace std;
struct Edge{
int to[MAXM],cap[MAXM],nxt[MAXM],head[MAXN],ent;
void Init(){
ent=2; memset(head,0,sizeof(head));
}
void Adde(int u,int v,int w){
to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;
}
int Next(int i,bool type){
return type?head[i]:nxt[i];
}
}E;
int cur[MAXN],d[MAXN];
int N,M,S,T,ans;
int idx(int i,int j,int k){
return (i-1)*M+j+k*N*M;
}
bool bfs(){
queue<int>q; int u,v;
memset(d,0,sizeof(d));
d[S]=1; q.push(S);
while(!q.empty()){
u=q.front(); q.pop();
for(int i=E.Next(u,1);i;i=E.Next(i,0)){
v=E.to[i];
if(d[v]||!E.cap[i]) continue;
d[v]=d[u]+1; q.push(v);
}
}
return d[T];
}
int dfs(int u,int reflow){
if(u==T||!reflow) return reflow;
int flowout=0,f,v;
for(int i=E.Next(u,1);i;i=E.Next(i,0)){
v=E.to[i];
if(d[v]!=d[u]+1) continue;
f=dfs(v,min(reflow,E.cap[i]));
flowout+=f; E.cap[i^1]+=f;
reflow-=f; E.cap[i]-=f;
if(!reflow) break;
}
if(!flowout) d[u]=0;
return flowout;
}
int Dinic(){
int flow=0;
while(bfs()){
memcpy(cur,E.head,sizeof(E.head));
flow+=dfs(S,INF);
}
return flow;
}
int main()
{
E.Init();
scanf("%d%d",&N,&M);
S=N*M*5+1; T=N*M*5+2;
for(int i=1,x;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&x),ans+=x,E.Adde(S,idx(i,j,0),x);
for(int i=1,x;i<=N;i++)
for(int j=1;j<=M;j++)
scanf("%d",&x),ans+=x,E.Adde(idx(i,j,0),T,x);
for(int i=1,_i,_j,x;i<N;i++)
for(int j=1;j<=M;j++){
scanf("%d",&x); ans+=x;
E.Adde(S,idx(i,j,1),x);
E.Adde(idx(i,j,1),idx(i,j,0),INF);
E.Adde(idx(i,j,1),idx(i+1,j,0),INF);
}
for(int i=1,_i,_j,x;i<N;i++)
for(int j=1;j<=M;j++){
scanf("%d",&x); ans+=x;
E.Adde(idx(i,j,2),T,x);
E.Adde(idx(i,j,0),idx(i,j,2),INF);
E.Adde(idx(i+1,j,0),idx(i,j,2),INF);
}
for(int i=1,_i,_j,x;i<=N;i++)
for(int j=1;j<M;j++){
scanf("%d",&x); ans+=x;
E.Adde(S,idx(i,j,3),x);
E.Adde(idx(i,j,3),idx(i,j,0),INF);
E.Adde(idx(i,j,3),idx(i,j+1,0),INF);
}
for(int i=1,_i,_j,x;i<=N;i++)
for(int j=1;j<M;j++){
scanf("%d",&x); ans+=x;
E.Adde(idx(i,j,4),T,x);
E.Adde(idx(i,j,0),idx(i,j,4),INF);
E.Adde(idx(i,j+1,0),idx(i,j,4),INF);
}
int der=Dinic();
ans-=der;
printf("%d",ans);
return 0;
}

●BOZJ 2127 happiness的更多相关文章

  1. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  2. bzoj——2127: happiness

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2570  Solved: 1242[Submit][Status][D ...

  3. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

  4. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  5. bzoj 2127: happiness

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

  6. BZOJ 2127 happiness ——网络流

    [题目分析] 基本上是第一次真正的使用最小割的模型. 同时加上一个数然后最后再减去是处理负数的一种方法. 设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解. 这 ...

  7. bzoj 2127 happiness【最小割+dinic】

    参考:https://www.cnblogs.com/chenyushuo/p/5144957.html 不得不说这个建图方法真是非常妙啊 假设S点选理,T点选文,a[i][j]为(i,j)选文收益, ...

  8. BZOJ 2127: happiness(最小割解决集合划分)

    Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 2350  Solved: 1138[Submit][Status][Discuss] Descript ...

  9. 【BZOJ】【2127】happiness

    网络流/最小割 Orz Hzwer. 这题他题解说的比较简略……我手画了个图才明白过来…… 嗯对于每个人选文or理的单独收益大家应该很好理解……连S->i 权值为选文的喜悦值,i->T权值 ...

随机推荐

  1. 关于python词典(Dictionary)的get()用法

    先贴出参考链接:http://www.runoob.com/python/att-dictionary-get.html get()方法语法: dict.get(key, default=None) ...

  2. 敏捷冲刺每日报告二(Java-Team)

    第二天报告(10.26  周四) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  3. iOS开发-继承特征详解

    面向对象的三大特性:封装,继承,多态. 1.继承 继承既能保证类的完整,又能简化代码. 把公共的方法和实例变量写在子类,子类只需要写父类独有的实例变量和方法即可. 继承是面向对象三大特性之一,合理的继 ...

  4. NumPy简介

    NumPy是什么? NumPy(Numerrical Python 的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组.NumPy包含很多实用的数学函数,涵盖线性代数运 ...

  5. Flask学习 二 模板

    jinja2模版 from flask import Flask,render_template app = Flask (__name__) @app.route ('/<name>') ...

  6. JAVA中if多分支和switch的优劣性。

    Switch多分支语句switch语句是多分支选择语句.常用来根据表达式的值选择要执行的语句.例如,在某程序中,要求将输入的或是获取的用0-6代表的星期,转换为用中文表示的星期.该需求通过伪代码描述的 ...

  7. JVM笔记7-内存分配与回收策略

    1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区中没有足够空间分配时,虚拟机将发起一次Minor GC.虚拟机提供了-XX:PrintGCDetails 这个收集器 ...

  8. 学习UI的总结

    学习前端有一段时间了,一直在看书上的理论知识,而实战项目却很少.老师常说,想要知道自己的实力有多少,知识掌握了多少,最好的方法就是去实践了,实践出真知嘛.于是在学习中,总要是通过项目的实践以及理论知识 ...

  9. JAVA_SE基础——21.二维数组的定义

    2 二维数组的定义 基本与一维数组类似 //定义一个3行5列的二维数组 //方法1,先new对象,然后再初始化每个元素 int[][] a = new int[3][5]; a[0][0]=1; a[ ...

  10. 简单介绍 CPU 的工作原理

    1.内部架构 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 .其内部架构如下: [1] ...