洛谷传送门 LOJ传送门

太空飞行计划问题一样,这依然是一道最大权闭合图问题

“骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法

分析题目,如果我们能把所有方格的数都给取上,那么总和是一个定值$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题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)的更多相关文章

  1. AC日记——[网络流24题]方格取数问题 cogs 734

    734. [网络流24题] 方格取数问题 ★★☆   输入文件:grid.in   输出文件:grid.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: 在一个有m*n ...

  2. Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)

    [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...

  3. [网络流24题] 方格取数问题(cogs 734)

    «问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.«编程任务:对于给定的方格棋 ...

  4. luogu2774 [网络流24题]方格取数问题 (最小割)

    常见套路:棋盘黑白染色,就变成了一张二分图 然后如果选了黑点,四周的白点就不能选了,也是最小割的套路.先把所有价值加起来,再减掉一个最少的不能选的价值,也就是割掉表示不选 建边(S,黑点i,v[i]) ...

  5. XTU 二分图和网络流 练习题 C. 方格取数(1)

    C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class ...

  6. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  7. 【网络流24题】No.19 负载平衡问题 (费用流)

    [题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input ...

  8. 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

    [题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...

  9. 【Luogu】P2045方格取数加强版(最小费用最大流)

    题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...

随机推荐

  1. Oracle-表更名、转存数据

    --更名 ALTER TABLE T_LOGSRV_SERVICE RENAME TO T_LOGSRV_SERVICE_20170418_BAK; --创建同样的表 ;

  2. HDU 5175

    我想了很久了,后来还是把N分解质因数,枚举各种组合,反正也不多吧,按题目条件,然后就过了. #include <cstdio> #include <iostream> #inc ...

  3. [Cypress] Test React’s Controlled Input with Cypress Selector Playground

    React based applications often use controlled inputs, meaning the input event leads to the applicati ...

  4. 拓扑排序---AOV图

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列, 使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如 ...

  5. Codeforces Round #244 (Div. 2)D (后缀自己主动机)

    Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...

  6. 开源前夕先给大家赞赏一下我用C语言开发的云贴吧 站点自己主动兼容-移动、手机、PC自己主动兼容云贴吧

    开源前夕先给大家赞赏一下我用C语言开发的移动.手机.PC自己主动兼容云贴吧 - 涨知识属马超懒散,属虎太倔强.十二生肖全了!-转自云寻觅贴吧 转: 涨知识属马超懒散,属虎太倔强.十二生肖全了! -转自 ...

  7. Java封装FushionCharts

    近期公司接了个关于数据统计的系统.须要用到报表功能.找了几天认为还是FushionCharts 适合.所以就对FushionCharts进行了java代码封装,方便,前台,后台调用. 1.报表Mode ...

  8. bzoj4887: [Tjoi2017]可乐

    一眼暴力宽搜(最近比赛想暴力想疯了... 很明显的矩乘,然后自爆可以看作走向向一个无出边的点 然后没啥难的了吧. #include<cstdio> #include<iostream ...

  9. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...

  10. 添加了click事件不响应

    https://stackoverflow.com/questions/18897807/on-click-event-on-td-created-dynamically 按照这个,给td添加clic ...