[题解] bzoj3894 文理分科

技术[题解] bzoj3894 文理分科 [题解] bzoj3894 文理分科题目链接
题目描述
\(n\) 行 \(m\) 列的矩阵,每个人可以选文科或者理科。第 \(i,j\) 个人选文科贡献为 \

[题解] bzoj3894文理分科

题目链接

题目描述

\(n\)行\(m\)列的矩阵,每个人可以选文科或者理科。第\(i,j\)个人选文科贡献为\(a_{i,j}\),选理科贡献为\(b_{i,j}\),周围及自己选文科贡献为\(c_{i,j}\),周围及自己选理科贡献为\(d_{i,j}\)。

思路

建图方法见代码。

利用最大权闭合子图,考虑全选文科,初始值为\(\sum a_{i,j} c_{i,j}\)。

那么理科的贡献就为\(b_{i,j}\),全选理科的贡献为\(d_{i,j}\)。

不选文科的贡献为\(-a_{i,j}\),\(5\)人之中有一个不选的贡献为\(-c_{i,j}\)。

则内部构图中,有三个约束条件:

选了理科,则必不选文科。

选了\(d_{i,j}\),则四周及自己都必须选理科。

选了一个不选文科,则与这个点相关的\(c_{i,j}\)都必须破坏,及必选相关的\(-c_{i,j}\)。

则答案为\(\ sum a _ { I,j} b_{i,j} c_{i,j} d_{i,j})-mincut\)。

Code

#包含cstdio

#定义INF0x3f3f

const int MAXN=2e5 5

const int MaxM=1e 6 5;

结构边缘{ int To,Cap,Next}边[MAXM 1];

int head[MAXN],tot=1;

void Addedge(int u,int v,int w){ 0

边缘[ tot].下一个=头[u],边[tot]。To=v,edge[tot].Cap=w,head[u]=tot;

边缘[ tot].下一个=头部[v],边缘[tot].To=u,edge[tot].Cap=0,head[v]=tot;

}

int cur[MAXN],dep[MAXN],que[MAXN],qhead,qtail

int n,m,s,t;

int addx[]={0,0,1,-1,0 };

int addy[]={1,-1,0,0,0 };

int ans

int Min(int x,int y){ return x y x :y;}

布尔bfs(布尔限制){ 0

for(int I=s;I=t;i ) dep[i]=0,cur[I]=head[I];

qhead=1;qtail=1;que[1]=t;dep[t]=1;

while(qhead=qtail){ 0

int u=que[qhead];

for(int I=head[u];我;i=edge[i].下一个){ 0

int v=edge[i].到;

if(!副[v]边[i ^ 1].Cap(!限制||!(一(1)))(

dep[v]=dep[u]1;

que[qtail]=v;

if (v==s)返回1;

}

}

}

返回0;

}

int dfs(int u,int flow){ 0

if(u==t ||!流量)回流;

int rest=flow

for(int I=cur[u];我休息;i=edge[i].下一个){ 0

cur[u]=I;

int v=edge[i].到;

if(dep[v]==dep[u] - 1边[i].Cap) {

int del=dfs(v,Min(静止,边缘[i]).cap));

rest-=del;边缘cap-=del;边缘[我^ 1]。Cap=del

if(!del)dep[v]=-2;

}

}

回流休息;

}

int Dinic(){ 0

int res=0,流;

while (bfs(1)) while ((flow=dfs(s,INF)))RES=flow;

while (bfs(0)) while ((flow=dfs(s,INF)))RES=flow;

返回表示留数

}

int Get(int x,int y,int h){ 0

return(x-1)* m y n * m * h;

}

int main(){ 0

scanf('%d %d ',n,m);

s=0,t=4 * n * m ^ 1;

for(int I=1;I=n;I){ 0

for (int j=1,a;j=m;j ) {

scanf("% d ",a);

Addedge(Get(i,j,0),t,a);

ans=a;

}

}

for(int I=1;I=n;I){ 0

for (int j=1,a;j=m;j ) {

scanf("% d ",a);

Addedge(s,Get(i,j,1),a);

Addedge(Get(i,j,1),Get(i,j,0),INF);

ans=a;

}

}

for(int I=1;I=n;I){ 0

for (int j=1,a;j=m;j ) {

scanf("% d ",a);

Addedge(Get(i,j,2),t,a);

ans=a;

for(int k=0;K5;k){ 0

int ni=I addx[k];

int NJ=j addy[k];

if (ni 1 || ni n || nj 1 || nj m)继续;

Addedge(Get(ni,nj,0),Get(i,j,2),INF);

}

}

}

for(int I=1;I=n;I){ 0

for (int j=1,a;j=m;j ) {

scanf("% d ",a);

ans=a;

Addedge(s,Get(i,j,3),a);

for(int k=0;K5;k){ 0

int ni=I addx[k];

int NJ=j addy[k];

if (ni 1 || ni n || nj 1 || nj m)继续;

Addedge(Get(i,j,3),Get(ni,nj,1),INF);

}

}

}

printf('%d ',ans-Dinic());

返回0;

}

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/141448.html

(0)

相关推荐

  • 玩具(Toy)

    技术玩具(Toy) 玩具(Toy)清华OJ——数据结构与算法实验(中国石油大学)玩具(Toy)Description
    ZC God is best at logical reasoning. One d

    礼包 2021年11月27日
  • 怎么理解C++11的返回类型后置

    技术怎么理解C++11的返回类型后置这篇文章主要介绍“怎么理解C++11的返回类型后置”,在日常操作中,相信很多人在怎么理解C++11的返回类型后置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

    攻略 2021年11月24日
  • 淘宝怎么评论,淘宝里怎么找到自己的评价

    技术淘宝怎么评论,淘宝里怎么找到自己的评价步骤一首先进入手机淘宝app步骤二进入淘宝页面登录自己的账号后淘宝怎么评论,点击“我的淘宝”步骤三在必选工具中点击“查看全部工具”步骤四在互动参与中选择“我的评价”步骤五在跳出的

    生活 2021年10月29日
  • 变脸是什么剧,究竟什么样的脸才称得上剧抛脸

    技术变脸是什么剧,究竟什么样的脸才称得上剧抛脸我觉得剧抛脸可以提名任嘉伦变脸是什么剧。所谓的剧抛脸就是同一个演员,他在演任何一部戏的时候没有他本人的影子。也没有他上一部作品的影子,演的就是这部作品中的角色。每演一部作品不

    生活 2021年10月29日
  • CAS存在哪些问题

    技术CAS存在哪些问题本篇内容主要讲解“CAS存在哪些问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CAS存在哪些问题”吧!1、循环+CAS,自旋的实现让所有线程处于高频

    攻略 2021年11月16日
  • 哪些业务适合租用香港服务器

    技术哪些业务适合租用香港服务器虽然大多数海外建站能从租用香港服务器中获得很多好处。然而,很多网站并不需要一开始就租用高性能的香港服务器,那么哪些业务适合使用香港服务器呢,下面就来介绍一下以下几个业务类型更适合使用香港服务

    礼包 2021年10月19日