Topcoder SRM558 1000 SurroundingGame
题意:给定一个网格,每个网格有选取代价和占据收益。每个点被占据,需要满足以下两个条件至少一个条件:1.被选取 2.邻近方格都被选取(有公共边被称为邻近) 不一定要占据所有方格,求最大收益。
第一直观感受和文理分科那道题很像,这类肯定用最小割,这种题一般都这样搞,但是建图是个大问题。这道题建出来的图要满足,如果一个点要保留收益,那么要么自己的花费边被割,要么邻近的被割,怎么建呢?
考虑先黑白染色,拆点,然后我们S连向黑色,容量为花费,黑色向自己的分身连收益边,并且黑色向相邻的白色点的分身连INF,黑色分身向白色连INF,白色分身向自己连收益,白色向T连花费。
仔细观察我们发现,确实能满足要求。
这种题一般都是套路,我也不知道怎么就要这么建边,不过可以总结出一些东西,比如一旦有关系,两者之间都会连INF以确保能彼此影响又不会被最小割割中,然后花费和收益,拆点怎么安排就要看具体的题目了。
上代码(与原题的输入不一样,是自己写的)
#include<bits/stdc++.h>
using namespace std;
#define N 25
#define INF 1e9
#define id(x,y) ((x-1)*m+y)
inline int read(){
int x=,f=; char a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar();
return x*f;
}
const int dir[][]={,,-,,,,,-};
int n,m,be[N][N],co[N][N],S,T,P,ans,d[],head[],cur[],cnt;
bool vis[];
queue<int>q;
struct edges{
int to,cap,flow,next;
}e[];
inline void insert(int u,int v,int c){
e[cnt]=(edges){v,c,,head[u]};head[u]=cnt++;
e[cnt]=(edges){u,,,head[v]};head[v]=cnt++;
}
inline bool bfs(){
memset(vis,,sizeof(vis));
vis[S]=; d[S]=; q.push(S);
while(!q.empty()){
int x=q.front(); q.pop();
for(int i=head[x];i>=;i=e[i].next){
if(!vis[e[i].to] && e[i].cap>e[i].flow)
d[e[i].to]=d[x]+,q.push(e[i].to),vis[e[i].to]=;
}
}
return vis[T];
}
int dfs(int x,int a){
if(x==T || !a) return a;
int f,flow=;
for(int& i=cur[x];i>=;i=e[i].next){
if(d[e[i].to]==d[x]+ && (f=dfs(e[i].to,min(a,e[i].cap-e[i].flow)))>)
e[i].flow+=f,flow+=f,e[i^].flow-=f,a-=f;
if(!a) break;
}
return flow;
}
inline int maxflow(){
int flow=;
while(bfs()){
for(int i=S;i<=T;i++) cur[i]=head[i];
flow+=dfs(S,INF);
}
return flow;
}
int main(){
memset(head,-,sizeof(head));
n=read(); m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
be[i][j]=read(),ans+=be[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
co[i][j]=read();
S=; T=*n*m+; P=n*m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
int x,y;
if((i+j)%){
insert(S,id(i,j),co[i][j]),insert(id(i,j),id(i,j)+P,be[i][j]);
for(int k=;k<;k++){
x=i+dir[k][],y=j+dir[k][];
if(x< || x>n || y< || y>m) continue;
insert(id(i,j),id(x,y)+P,INF);
insert(id(i,j)+P,id(x,y),INF);
}
}
else insert(id(i,j)+P,id(i,j),be[i][j]),insert(id(i,j),T,co[i][j]);
}
ans-=maxflow();
printf("%d\n",ans);
return ;
}
Topcoder SRM558 1000 SurroundingGame的更多相关文章
- TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
传送门:https://284914869.github.io/AEoj/558.html 题目简述 一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子. 这个 ...
- 经典数学问题<手电过河问题>的动态解法--问题规模扩展至任意大小
非常有趣的一件事是今天在TopCoder的1000分题里面发现了这道经典数学问题. Notes - In an optimal solution ...
- TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E
传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...
- Topcoder Srm 673 Div2 1000 BearPermutations2
\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对 ...
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
\(>Topcoder \space Srm \space 671 \space Div2 \space 1000 \space BearDestroysDiv2<\) 题目大意 : 有一 ...
- TopCoder SRM500 Div1 1000 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html SRM500 Div1 1000 设 \(v_1,v_2,\cdots ,v_9 ...
- TopCoder SRM502 Div1 1000 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...
- TopCoder[SRM513 DIV 1]:Reflections(1000)
Problem Statement Manao is playing a new game called Reflections. The goal of the game is trans ...
- TopCoder SRM 642 Div.2 1000 --二分+BFS
题意: 给你一张图,N个点(0~N-1),m条边,国王要从0到N-1,国王携带一个值,当走到一条边权大于此值的边时,要么不走,要么提升该边的边权,提升k个单位花费k^2块钱,国王就带了B块钱,问能携带 ...
随机推荐
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- strom的使用02
1.grouping分组策略 stream grouping就是用来定义一个stream应该如果分配给Bolts上面的多个Tasks. storm里面有6种类型的stream grouping: 1. ...
- OpenLayers2.13.1知识整理
对于地图的默认加载等,网上很多资料,就不细说了,主要整理解决一些api不明显或不全的内容 因玩webgis只有一周左右,肯定很水~~ 我资料中的目录结构如下: html map js(自己封装的js目 ...
- linux开发摘要
1.linux内核文档链接点击打开链接 2.配置文件 在out\target\product\project\obj\KERNEL_OBJ\.config中可以看到 # CONFIG_MTD_LPDD ...
- [iOS][issis] requestLocationWithReGeocode AMapLocationErrorDomain Code=5 "取消"
Tip: IOS 使用高德地图一次定位 (在该博客找到了解决答案) 在定位时如果出现下面这个Error,说明你的locationManager没有设置成全局变量,导致locationManager提 ...
- 企业办公3D指纹考勤系统解决方案
员工准时.正常出勤是企业考勤制度的基本要求,然而目前签名式.卡钟式.IC卡考勤系统均存在代打卡.人情卡.不易统计等漏洞,而市面上的光学指纹考勤机存在识别能力差.识别速度慢.使用寿命短.不能完全杜绝指纹 ...
- Lucene 简单API使用
本demo 简单模拟实现一个图书搜索功能. 模拟向数据库添加数据的时候,添加书籍索引. 提供搜索接口,支持按照书名,作者,内容进行搜索. 按默认规则排序返回搜索结果. Jar依赖: <prope ...
- 插件开发-UI插件开发
1.新建类库解决方案,引入命名空间,同时引入要添加UI Form的WebPart(在Portal\UILib目录下) 2.继续UFSoft.UBF.UI.Custom.ExtendedPartBase ...
- 用SignalR实现实时查看WebAPI请求日志
实现的原理比较直接,定义一个MessageHandler记录WebAPI的请求记录,然后将这些请求日志推送到客户端,客户端就是一个查看日志的页面,实时将请求日志展示在页面中. 这个例子的目的是演示如何 ...
- linux应用程序开发-进程通信(IPC)
IPC why: 1.数据传输 2.资源共享 目的: 3.通知事件 4.进程控制 发展: 1.UNIX进程间通信 2.基于SYStem V 3.POSIX 方式分类: 1.pipe(管道) FIFO( ...