其实也就卡了卡常,,,

先考虑没有same_art和same_science 。

起点用art的流量连向每个点,该点再用science的流量连向终点,断开哪边相当于少了哪边收益。

先全部收益加起来,再减去最小割即可。

那有same这些情况怎么办呢。

考虑新建节点v,起点以same_art连向v,断开即代表不获得这段收益。如何避免这个点不断开s的同时它覆盖区的点断开了s?再用v点向覆盖区连权值为inf的边,即可保证覆盖区的点要断则该点必断。same_science同理,在下不加以赘述。

528ms,勉强能卡过,,

#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<vector>
#include<iostream>
#define ll int
#define re register
#define inf 0x7f7f7ff
#define inl inline
#define sqr(x) (x*x)
//#define eps 1e-8
#define debug printf("debug\n");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
using namespace std;
const ll mod=51123987;
const ll MAXN=105;
inl ll read() {re ll x = 0; re int f = 1;char ch = getchar();while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x * f;
}
inl char readc() {char ch=getchar();while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();return ch;
}
inl void write(re ll x){if(x>=10)write(x/10);putchar(x%10+'0');
}
inl void writeln(re ll x){if(x<0) {x=-x;putchar('-');}write(x); puts("");
}
inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;}
inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;}
inl void FR() {freopen(".in","r",stdin);freopen(".out","w",stdout);
}
inl void FC() {fclose(stdin);fclose(stdout);
}
struct edge{ll u,v,w,nxt;
}e[400005<<1];
ll ans,n,m,cnt=1,head[200005<<1],s,t,sst;
ll dx[10]={0,0,0,1,-1};
ll dy[10]={0,1,-1,0,0};
inl void adde(ll u,ll v,ll w) {e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
ll d[200005<<1],cur[200005<<1];
inl bool bfs() {queue<ll>Q;for(re ll i=s;i<=sst;i++) d[i]=0;Q.push(s);d[s]=1;while(!Q.empty()) {re ll x=Q.front();Q.pop();for(re ll h=head[x];h;h=e[h].nxt) {re ll v=e[h].v;if(e[h].w&&!d[v]) {d[v]=d[x]+1;if(v==t) return true ;Q.push(v);}}}return d[t];
}
ll dfs(ll x,ll limit) {if(x==t) return limit;ll used=0;for(re ll h=cur[x];h;h=e[h].nxt) {if(used==limit) break;if(d[e[h].v]==d[x]+1&&e[h].w) {ll t=dfs(e[h].v,min(limit-used,e[h].w));used+=t;e[h].w-=t;e[h^1].w+=t;}}if(!used) d[x]=0;return used;
}
int main() {
//  FR();n=read(),m=read();s=0;t=n*m+1;sst=t;for(re ll i=1;i<=n;i++) {for(re ll j=1;j<=m;j++) {re ll x=read();adde(s,(i-1)*m+j,x);adde((i-1)*m+j,s,0);ans+=x;}}for(re ll i=1;i<=n;i++) {for(re ll j=1;j<=m;j++)  {re ll x=read();adde((i-1)*m+j,t,x);adde(t,(i-1)*m+j,0);ans+=x;}}for(re ll i=1;i<=n;i++) {for(re ll j=1;j<=m;j++) {re ll x=read();ans+=x;sst++;adde(s,sst,x);adde(sst,s,0);for(re ll k=0;k<=4;k++) {re ll xx=i+dx[k],yy=j+dy[k];if(xx&&xx<=n&&yy&&yy<=m) {adde(sst,(xx-1)*m+yy,inf);adde((xx-1)*m+yy,sst,0);}}}}for(re ll i=1;i<=n;i++) {for(re ll j=1;j<=m;j++) {re ll x=read();ans+=x;sst++;adde(sst,t,x);adde(t,sst,0);for(re ll k=0;k<=4;k++) {re ll xx=i+dx[k],yy=j+dy[k];if(xx&&xx<=n&&yy&&yy<=m) {adde((xx-1)*m+yy,sst,inf);adde(sst,(xx-1)*m+yy,0);}}}}while(bfs()) {memcpy(cur,head,sizeof(cur));ans-=dfs(s,inf);}writeln(ans);
//  FC();return 0;
}

转载于:https://www.cnblogs.com/20020723YJX/p/9415477.html

P4313 文理分科 网络流相关推荐

  1. P4313 文理分科 详细理解

    P4313 文理分科 网络其他地方看到的原话:在说这道题之前,让我们先思考一下最小割的性质.最小割就是使得s到t割掉的最小边的容量,割过之后,所有的点要么与s联通,要么与t联通. 这样的性质,即要么与 ...

  2. (最小割)洛谷P4313文理分科

    洛谷P4313文理分科 思路: 一下子就可以想到最小割,先不考虑一起选的情况的话,就是文理二者择其一的选择. SSS向(i,j)(i,j)(i,j)建边,权值为arti,jart_{i,j}arti, ...

  3. BZOJ 3894 Luogu P4313 文理分科 (最小割)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...

  4. P4313 文理分科

    HyperlinkHyperlinkHyperlink https://www.luogu.com.cn/problem/P4313 DescriptionDescriptionDescription ...

  5. LuoguP4313 BZOJ3894 文理分科——最小割

    洛谷:文理分科 传送门 题目描述: 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学必须从文科和理科中选择一科.同学们在选择科目的时候会获得一 ...

  6. BZOJ3894:文理分科——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...

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

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

  8. 文理分科 (最小割问题)

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

  9. BZOJ3894 文理分科

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

最新文章

  1. matplotlib 子图超过4个_走进Matplotlib世界(四)
  2. android n 发布时间,Android N 正式版将在9月发布
  3. pthread_join函数
  4. linux无线网卡断断续续,关于ubuntu16无线网卡RTL8723BE频繁掉线及信号不足的解决方法...
  5. MySQL · BUG分析 · Rename table 死锁分析
  6. python——sort方法、sorted函数——排序
  7. 浅谈找到***点后的处理(清理***)
  8. ModelState.IsValid一直为false的原因
  9. python 相关系数显著检验_Python dataframe 算相关系数用corr(),算不出结果
  10. 程序人生-我已经努力了七年!!!
  11. linux磁盘阵列 启动盘,Linux RAID磁盘列阵完全攻略
  12. 小象学院python数据分析课程怎么样_小象学院大数据分析集训营试听知识点整理-正则表达式...
  13. 光学定位与追踪技术_光学跟踪技术定位精准罗技M90鼠标仅32
  14. IDEA mybatis XML文件格式化问题
  15. 夏季必不能少六道凉拌菜
  16. MongoDB 安装报错:无法启动此程序,缺少dll文件
  17. 快速排序优化——三数取中法
  18. nc: command not found完美解决(linux配置nc命令)
  19. Segmenter Transformer for Semantic Segmentation
  20. 通过组策略设置输入法

热门文章

  1. 二叉排序树查找的c语言程序,C语言二叉排序(搜索)树实例
  2. 【CodeForces - 246D】Colorful Graph (暴力,图,存边,STL)
  3. 百度顶会论文复现(1):课程概述
  4. Ubuntu系统中使用搜狗输入法
  5. 使用matplotlib进行简单的数据展示
  6. mysql rand() 子查询_MySQL ------ 子查询(十三)
  7. python 升级所有库_自动更新Python所有第三方库
  8. 【算法系列之十二】最接近的三数之和
  9. Android入门(九)| 滚动控件 ListView 与 RecyclerView
  10. leetcode164. 最大间距 借桶思想秒掉hard题