P4313 文理分科
思路
遇到这种利益冲突的最终利益最大化问题
考虑转化为最小割,使得损失的价值最小
相当于文科是S,理科是T,选出最小割就是确定损失代价最小的方案
然后就把S向每个点连一条cap=art[i][j]的边,每个点向T连一条cap=science[i][j]的边,再新建n*m个点表示同选文科的利益,然后S向每个新建点连一条cap=same_art[i][j]的边,然后再从新建点向每个点和它的相邻点向连一条cap=INF的边,然后同选立刻的收益同理新建点再向T连边,相邻点同理的向新建点连边
再跑出最小割即可
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct Edge{
int u,v,cap,flow;
};
const int MAXN = 40100;
const int INF = 0x3f3f3f3f;
vector<Edge> edges;
vector<int> G[MAXN];
void addedge(int u,int v,int cap){
edges.push_back((Edge){u,v,cap,0});
edges.push_back((Edge){v,u,0,0});
int cnt=edges.size();
G[u].push_back(cnt-2);
G[v].push_back(cnt-1);
}
int cur[MAXN],dep[MAXN],vis[MAXN],s,t;
int dfs(int x,int a){
if(x==t||a==0)
return a;
int f,flow=0;
for(int &i=cur[x];i<G[x].size();i++){
Edge &e = edges[G[x][i]];
if(dep[e.v]==dep[x]+1&&(f=dfs(e.v,min(e.cap-e.flow,a)))>0){
flow+=f;
e.flow+=f;
edges[G[x][i]^1].flow-=f;
a-=f;
if(!a)
break;
}
}
return flow;
}
queue<int> q;
bool bfs(void){
memset(vis,0,sizeof(vis));
dep[s]=0;
vis[s]=true;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<G[x].size();i++){
Edge &e = edges[G[x][i]];
if(e.cap>e.flow&&(!vis[e.v])){
vis[e.v]=true;
dep[e.v]=dep[x]+1;
q.push(e.v);
}
}
}
return vis[t];
}
int dinic(void){
int flow=0;
while(bfs()){
// printf("Not Re\n");
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
int n,m,same_wen[110][110],same_li[110][110],wen[110][110],li[110][110],sum=0;
const int mx[] = {0,0,1,-1,0},my[] ={0,1,0,0,-1};
int id(int x,int y,int idx=0){
return (x-1)*m+y+idx*n*m;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&wen[i][j]);
sum+=wen[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&li[i][j]);
sum+=li[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&same_wen[i][j]);
sum+=same_wen[i][j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&same_li[i][j]);
sum+=same_li[i][j];
}
// printf("Not Re\n");
s=MAXN-2;//wen
t=MAXN-3;//li
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
addedge(s,id(i,j),wen[i][j]);//wen
addedge(id(i,j),t,li[i][j]);//li
}
for(int i=1;i<=n;i++)//shang
for(int j=1;j<=m;j++){
addedge(s,id(i,j,1),same_wen[i][j]);
addedge(id(i,j,1),id(i,j),INF);
if(i>1)
addedge(id(i,j,1),id(i-1,j),INF);
if(j>1)
addedge(id(i,j,1),id(i,j-1),INF);
if(i<n)
addedge(id(i,j,1),id(i+1,j),INF);
if(j<m)
addedge(id(i,j,1),id(i,j+1),INF);
}
for(int i=1;i<=n;i++)//shang
for(int j=1;j<=m;j++){
addedge(id(i,j,2),t,same_li[i][j]);
addedge(id(i,j),id(i,j,2),INF);
if(i>1)
addedge(id(i-1,j),id(i,j,2),INF);
if(j>1)
addedge(id(i,j-1),id(i,j,2),INF);
if(i<n)
addedge(id(i+1,j),id(i,j,2),INF);
if(j<m)
addedge(id(i,j+1),id(i,j,2),INF);
}
// printf("Not Re\n");
printf("%d\n",sum-dinic());
return 0;
}
P4313 文理分科的更多相关文章
- P4313 文理分科 最小割
$ \color{#0066ff}{ 题目描述 }$ 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- BZOJ 3894 Luogu P4313 文理分科 (最小割)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...
- BZOJ 3894 / Luogu P4313 文理分科 (拆点最小割)
题面 中文题面- BZOJ 传送门 Luogu 传送门 分析 这道题类似于BZOJ 3774 最优选择,然后这里有一篇博客写的很好- Today_Blue_Rainbow's Blog 应该看懂了吧- ...
- Luogu P4313 文理分科
link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...
- BZOJ 3894: 文理分科 [最小割]
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
- Bzoj3894 文理分科
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 667 Solved: 389 Description 文理分科是一件很纠结的事情!(虽然看到这个题 ...
- bzoj 3894: 文理分科
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位. ...
- BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割
BZOJ_3894_文理分科_最小割 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
随机推荐
- GeoJSON 和 TopoJSON
GeoJSON 和 TopoJSON 是符合 JSON 语法规则的两种数据格式,用于表示地理信息. 1. GeoJSON GeoJSON 是用于描述地理空间信息的数据格式.GeoJSON 不是一种新的 ...
- hdu2262 高斯消元
题目:有一个地图,一个人从某个点出发,问走到花园的期望步数为多少 设某点的期望步数为Ei. 那么目标的Ei=0. Ei=(Enext1+Enext2……Enextk)/k+1. 为什么是这个公式 因为 ...
- 大数据处理框架之Strom: Storm拓扑的并行机制和通信机制
一.并行机制 Storm的并行度 ,通过提高并行度可以提高storm程序的计算能力. 1.组件关系:Supervisor node物理节点,可以运行1到多个worker,不能超过supervisor. ...
- Qt—MVC架构
[1]代理应用示例源码 用代码说事,比较靠谱. 代码目录:三个自定义类,重实现QStyledItemDelegate类.main函数应用示例. (1)ComboDelegate.h #ifndef C ...
- sql server 中后缀为.mdf的文件是干什么用的??
在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...
- maven的profile详解
详细内容请见:https://www.cnblogs.com/wxgblogs/p/6696229.html Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建 ...
- python shutil模块简单介绍
python shutil模块简单介绍 简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. shutil 模块方法: copy(src, ...
- kubernetes install for centos
官方的文档写的很清楚 https://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/ 如果已经安装过doc ...
- Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg'
在运行cmd黑窗口时候出现:Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg'这样的错误的时候,本人没有删除任何文件,只是重新配置了一下jdk ...
- mycat的下载和安装
1.下载. 网址:http://dl.mycat.io/ 2.安装. 解压:tar zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz ...