[网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)
和太空飞行计划问题一样,这依然是一道最大权闭合图问题
“骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法
分析题目,如果我们能把所有方格的数都给取上,那么总和是一个定值$sum$
而题目要求我们取的数不能相邻,我们要想办法最大化$\sum$取的数$-\sum$没取的数
现在我们找到了一种取数方案,那么$\sum$取的数一定能填补上$\sum$没取的数,而且剩下的数总和$>0$,这样,方案才是有收益的
这不就是最大权闭合图的模型吗?
把每个格子拆成两个点,分别向源点和汇点连边,流量为它的权值,每个格子向四周连流量为$inf$的边
最小割割掉了用于填补的部分,用$sum-$最小割就是净收益了
方格取数问题:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N1 2510
#define M1 30100
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,nm,S,T;
int p[N1],c[N1];
int xx[]={-,,,},yy[]={,,,-};
struct Edge{
int head[N1],to[M1<<],nxt[M1<<],flow[M1<<],cte;
void ae(int u,int v,int F)
{
cte++; to[cte]=v; flow[cte]=F;
nxt[cte]=head[u]; head[u]=cte;
}
}e; int que[M1],hd,tl,dep[N1],cur[N1];
int bfs()
{
int x,j,v;
memset(dep,-,sizeof(dep)); memcpy(cur,e.head,sizeof(cur));
hd=,tl=; que[++tl]=S; dep[S]=;
while(hd<=tl)
{
x=que[hd++];
for(j=e.head[x];j;j=e.nxt[j])
{
v=e.to[j];
if(dep[v]==-&&e.flow[j]>)
dep[v]=dep[x]+, que[++tl]=v;
}
}
return dep[T]!=-;
}
int dfs(int x,int limit)
{
int j,v,flow,ans=; if(x==T||!limit) return limit;
for(j=cur[x];j;j=e.nxt[j])
{
cur[x]=j; v=e.to[j];
if( dep[v]==dep[x]+ && (flow=dfs(v,min(e.flow[j],limit))) )
{
limit-=flow; ans+=flow;
e.flow[j]-=flow; e.flow[j^]+=flow;
if(!limit) break;
}
}
return ans;
}
int Dinic()
{
int mxflow=;
while(bfs())
mxflow+=dfs(S,inf);
return mxflow;
} int a[N1];
int check(int x,int y){
if(x<||y<||x>n||y>m) return ; return ;}
int id(int x,int y){ return (x-)*m+y; } int main()
{
scanf("%d%d",&n,&m); nm=n*m;
int i,j,k,d,da,db,sum=,ans; S=*nm+,T=*nm+; e.cte=;
for(i=;i<=n;i++) for(j=;j<=m;j++)
{
d=id(i,j); a[d]=gint(); sum+=a[d];
e.ae(S,d,a[d]), e.ae(d,S,);
e.ae(d+nm,T,a[d]), e.ae(T,d+nm,);
}
for(i=;i<=n;i++) for(j=;j<=m;j++)
{
da=id(i,j);
for(k=;k<;k++)
if(check(i+xx[k],j+yy[k]))
{
db=id(i+xx[k],j+yy[k])+nm;
e.ae(da,db,inf), e.ae(db,da,);
}
}
ans=sum-Dinic();
printf("%d\n",(sum-ans)/+ans);
return ;
}
骑士共存问题: 只需要把点权改成1 加几个特判就行了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define L1 205
#define N1 80050
#define M1 400010
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,nn,S,T;
int p[N1],c[N1];
int xx[]={-,-,,,,,-,-},yy[]={,,,,-,-,-,-};
struct Edge{
int head[N1],to[M1<<],nxt[M1<<],flow[M1<<],cte;
void ae(int u,int v,int F)
{
cte++; to[cte]=v; flow[cte]=F;
nxt[cte]=head[u]; head[u]=cte;
}
}e; int que[N1],hd,tl,dep[N1],cur[N1];
int bfs()
{
int x,j,v;
memset(dep,-,sizeof(dep)); memcpy(cur,e.head,sizeof(cur));
hd=,tl=; que[++tl]=S; dep[S]=;
while(hd<=tl)
{
x=que[hd++];
for(j=e.head[x];j;j=e.nxt[j])
{
v=e.to[j];
if(dep[v]==-&&e.flow[j]>)
dep[v]=dep[x]+, que[++tl]=v;
}
}
return dep[T]!=-;
}
int dfs(int x,int limit)
{
int j,v,flow,ans=; if(x==T||!limit) return limit;
for(j=cur[x];j;j=e.nxt[j])
{
cur[x]=j; v=e.to[j];
if( dep[v]==dep[x]+ && (flow=dfs(v,min(e.flow[j],limit))) )
{
limit-=flow; ans+=flow;
e.flow[j]-=flow; e.flow[j^]+=flow;
if(!limit) break;
}
}
return ans;
}
int Dinic()
{
int mxflow=;
while(bfs())
mxflow+=dfs(S,inf);
return mxflow;
} int mp[L1][L1];
int check(int x,int y){
if(x<||y<||x>n||y>n||mp[x][y]) return ; return ;}
int id(int x,int y){ return (x-)*n+y; } int main()
{
scanf("%d%d",&n,&m); nn=n*n;
int i,j,k,d,da,db,x,y,sum=,ans; S=*nn+,T=*nn+; e.cte=;
for(i=;i<=m;i++) x=gint(), y=gint(), mp[x][y]=;
for(i=;i<=n;i++) for(j=;j<=n;j++)
{
if(mp[i][j]) continue; d=id(i,j); sum++;
e.ae(S,d,), e.ae(d,S,);
e.ae(d+nn,T,), e.ae(T,d+nn,);
}
for(i=;i<=n;i++) for(j=;j<=n;j++)
{
if(mp[i][j]) continue; da=id(i,j);
for(k=;k<;k++)
if(check(i+xx[k],j+yy[k]))
{
db=id(i+xx[k],j+yy[k])+nn;
e.ae(da,db,inf), e.ae(db,da,);
}
}
ans=sum-Dinic();
printf("%d\n",(sum-ans)/+ans);
return ;
}
[网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)的更多相关文章
- AC日记——[网络流24题]方格取数问题 cogs 734
734. [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n ...
- Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)
[网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...
- [网络流24题] 方格取数问题(cogs 734)
«问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.«编程任务:对于给定的方格棋 ...
- luogu2774 [网络流24题]方格取数问题 (最小割)
常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...
- XTU 二分图和网络流 练习题 C. 方格取数(1)
C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d Java class ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- 【网络流24题】No.19 负载平衡问题 (费用流)
[题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input ...
- 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)
[题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...
- 【Luogu】P2045方格取数加强版(最小费用最大流)
题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...
随机推荐
- 【ACM】hdu_zs2_1003_Problem C_201308031012
Problem C Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Subm ...
- POJ 1474
半平面交模板 #include <iostream> #include <cstdio> #include <cstring> #include <algor ...
- 公布IOS产品被拒后怎样再上传新公布包
问题描写叙述: 前两天提交公司产品2.0.7版本号到苹果审核,昨天提示被拒绝. 被拒原因就不描写叙述了. 我们经过改动后.又一次打包上传,但是怎么也提交不了.由于在苹果后台上已经存在2.0.7版本号的 ...
- MySQL联结表
联结 SQL最强大的功能之中的一个就是能在数据检索查询的运行中联结表.而联结表是基于关系表. 理解关系表例如以下,假如由同一供应商生产的多种物品.在数据库中须要存储产品信息,而在产品信息的这一行不存储 ...
- 数学之路-python计算实战(4)-Lempel-Ziv压缩(2)
Format characters have the following meaning; the conversion between C and Python values should be o ...
- @RequiresPermissions 注解说明
@RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ...
- Chrome改动浏览器User Agent
对浏览器快捷方式右键->改动目标项为 C:\Users\LJ\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent=&q ...
- express 4.2.0 使用session和cookies
express 4.2.0 使用session和cookies https://my.oschina.net/u/1466553/blog/294336
- JDBC基础02
今日知识 1. sql注入问题2. jdbc批处理3. 事务 SQL注入问题解决 1.什么是sql注入. * 用户通过相关的特殊关键字sql语句非法访问数据库 *例如: Xxx(' or '1'='1 ...
- python简易版学生管理系统
#coding=utf- def showInfo(): print("**************") print(" 学生管理系统") print(&quo ...