博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]
阅读量:4686 次
发布时间:2019-06-09

本文共 2046 字,大约阅读时间需要 6 分钟。

将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向。之后将源点和汇点分别于黑白格子连边,边权即为点权,最后用总权值减去最小割即可。

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define INF 0x3f3f3f3ftemplate
struct Edge{ struct Edge_base { int to,next,w; }e[_m]; int cnt,p[_n]; Edge() { clear(); } void insert(const int x,const int y,const int z) { e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; p[x]=cnt; return ; } int start(const int x) { return p[x]; } void clear() { cnt=1,memset(p,0,sizeof(p)); } Edge_base& operator[](const int x) { return e[x]; }};int n,m,N,SSS,TTT,a[410][410];int level[41000],cur[41000];Edge<41000,410000> e;bool Bfs(const int S){ int i,t; queue
Q; memset(level,0,sizeof(level)); level[S]=1; Q.push(S); while(!Q.empty()) { t=Q.front(),Q.pop(); for(i=e.start(t);i;i=e[i].next) { if(!level[e[i].to] && e[i].w) { level[e[i].to]=level[t]+1; Q.push(e[i].to); } } } return level[TTT];}int Dfs(const int S,const int bk){ if(S==TTT)return bk; int rest=bk; for(int &i=cur[S];i;i=e[i].next) { if(level[e[i].to]==level[S]+1 && e[i].w) { int flow=Dfs(e[i].to,min(e[i].w,rest)); e[i].w-=flow; e[i^1].w+=flow; if((rest-=flow)<=0)break; } } if(bk==rest)level[S]=0; return bk-rest;}int Dinic(){ int flow=0; while(Bfs(SSS)) { memcpy(cur,e.p,sizeof(cur)); flow+=Dfs(SSS,0x3f3f3f3f); } return flow;}int main(){ freopen("grid.in","r",stdin); freopen("grid.out","w",stdout); int i,j,Sum=0; scanf("%d%d",&n,&m); N=n*m;SSS=N+1,TTT=SSS+1; for(i=1;i<=n;++i)for(j=1;j<=m;++j) scanf("%d",&a[i][j]),Sum+=a[i][j]; for(i=1;i<=n;++i) { for(j=1;j<=m;++j) { int t=(i-1)*m+j; if(((i&1) && !(j&1)) || (!(i&1) && (j&1))) { e.insert(SSS,t,a[i][j]); e.insert(t,SSS,0); if(i>1)e.insert(t,t-m,INF),e.insert(t-m,t,0); if(i
1)e.insert(t,t-1,INF),e.insert(t-1,t,0); if(j
1)e.insert(t-m,t,INF),e.insert(t,t-m,0); if(i
1)e.insert(t-1,t,INF),e.insert(t,t-1,0); if(j

 

转载于:https://www.cnblogs.com/Gster/p/4996899.html

你可能感兴趣的文章
数据结构化与保存
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
Linux shell 命令判断执行语法 ; , && , ||
查看>>
vim代码格式化插件clang-format
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
kafka中的消费组
查看>>
python--注释
查看>>
SQL case when else
查看>>
MVc Identity登陆锁定
查看>>
cdn连接失败是什么意思_关于CDN的原理、术语和应用场景那些事
查看>>
ultraedit26 运行的是试用模式_免费试用U盘数据恢复工具 – 轻松找回U盘丢失的各种数据!...
查看>>
python sum函数导入list_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
查看>>
UVa540 Team Queue
查看>>
android 练习之路 (八)
查看>>
tp5 中 model 的聚合查询
查看>>