【题目大意】

给定一个m*n的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和。

【思路】

发现这道题那么久(比划——)之前交过没A。强迫症先水过填个坑。懒得写题解了,都是套路。思路类似于以前的小M的农作物,戳:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define S 0
#define T m*n*3+1
using namespace std;
const int INF=0x7fffffff;
const int MAXN=**+;
struct node
{
int to,pos,cap;
};
int m,n,ans;
vector<node> E[MAXN];
int dis[MAXN];
int dx[]={,-,,};
int dy[]={,,,-}; void addedge(int u,int v,int w)
{
E[u].push_back((node){v,E[v].size(),w});
E[v].push_back((node){u,E[u].size()-,});
} bool bfs()
{
memset(dis,-,sizeof(dis));
queue<int> que;
while (!que.empty()) que.pop();
que.push(S);
dis[S]=;
while (!que.empty())
{
int head=que.front();que.pop();
if (head==T) return true;
for (int i=;i<E[head].size();i++)
{
node tmp=E[head][i];
if (dis[tmp.to]==- && tmp.cap)
{
dis[tmp.to]=dis[head]+;
que.push(tmp.to);
}
}
}
return false;
} int dfs(int s,int e,int f)
{
if (s==e) return f;
int ret=;
for (int i=;i<E[s].size();i++)
{
node &tmp=E[s][i];
if (dis[tmp.to]==dis[s]+ && tmp.cap)
{
int delta=dfs(tmp.to,e,min(f,tmp.cap));
if (delta>)
{
tmp.cap-=delta;
E[tmp.to][tmp.pos].cap+=delta;
f-=delta;
ret+=delta;
if (f==) return ret;
}
else dis[tmp.to]=-;
}
}
return ret;
} void dinic()
{
while (bfs())
{
int f=dfs(S,T,INF);
if (f) ans-=f;else break;
}
printf("%d\n",ans);
} void init()
{
scanf("%d%d",&n,&m);
ans=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
int now=(i-)*m+j,art;
scanf("%d",&art);
addedge(S,now,art);
ans+=art;
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
int now=(i-)*m+j,science;
scanf("%d",&science);
addedge(now,T,science);
ans+=science;
} int cnt=m*n,same;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
++cnt;
scanf("%d",&same);
addedge(S,cnt,same);
ans+=same;
addedge(cnt,(i-)*m+j,INF);
for (int k=;k<;k++)
{
int nowx=i+dx[k],nowy=j+dy[k];
if (nowx>= && nowx<=n && nowy>= && nowy<=m)
addedge(cnt,(nowx-)*m+nowy,INF);
}
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
++cnt;
scanf("%d",&same);
addedge(cnt,T,same);
ans+=same;
addedge((i-)*m+j,cnt,INF);
for (int k=;k<;k++)
{
int nowx=i+dx[k],nowy=j+dy[k];
if (nowx>= && nowx<=n && nowy>= && nowy<=m)
addedge((nowx-)*m+nowy,cnt,INF);
}
}
} int main()
{
init();
dinic();
return ;
}

【最小割】BZOJ3894-文理分科的更多相关文章

  1. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  2. BZOJ3894文理分科——最小割

    题目描述  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...

  3. [Bzoj3894]文理分科(最小割)

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

  4. bzoj3894: 文理分科(还是那道最小割)

    3894: 文理分科 题目:传送门 感谢波老师没有来D飞我,让我做出了这题... 题解: 这题其实和我做的上一题(bzoj2132)很像,所以就不写题意了. 依然是那最小割... 这题给出了四个利益矩 ...

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

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

  6. Bzoj3894 文理分科

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 667  Solved: 389 Description  文理分科是一件很纠结的事情!(虽然看到这个题 ...

  7. [BZOJ3894]文理分科(最小割)

    (1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...

  8. BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

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

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

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

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

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

随机推荐

  1. 树形DP初探•总结

    这几天,我自学了基础的树形DP,在此给大家分享一下我的心得.   首先,树形DP这种题主要就是解决有明确分层次且无环的树上动态规划的题.这种题型一般(注意只是基础.普通的情况下)用深度优先搜索来解决实 ...

  2. [POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)

    [POJ 2559]Largest Rectangle in a Histogram Description A histogram is a polygon composed of a sequen ...

  3. 天梯赛 L1-009 N个数求和 (模拟)

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=1 ...

  4. python基础之常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  5. MySQL之——如何添加新数据库到MySQL主从复制列表 【转】

    转自 转载请注明出处:http://blog.csdn.net/l1028386804/article/details/54653691 MySQL主从复制一般情况下我们会设置需要同步的数据库,使用参 ...

  6. C# 获取mp3文件的歌曲时间长度

    添加命名空间:    using Shell32;    using System.Text.RegularExpressions;添加引用:COM组件的Microsoft Shell Control ...

  7. sicily 1240. Faulty Odometer

    Description You are given a car odometer which displays the miles traveled as an integer. The odomet ...

  8. golang类型转换小总结

    1. int <--> string 1.1. int --> string str := strconv.Itoa(intVal) 当然,整数转换成字符串还有其他方法,比如 fmt ...

  9. 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map),第三部分

    前面两篇介绍了SOM的基本概念和算法,第一部分,第二部分,本篇具体展开一下应用中的一些trick设定. SOM设计细节 输出层设计 输出层神经元数量设定和训练集样本的类别数相关,但是实际中我们往往不能 ...

  10. 快速开发window服务器程序

    import service; service.startDispatchThread( 服务名 = function(serviceName,argv){ import service; var s ...