bzoj4213: 贪吃蛇
题意:给定一个网格,有一些格子是障碍不用管,剩余的是空地,你要用一些起点和终点在边界上的路径或环来完全覆盖掉空地,如果使用第一种,会付出1的代价,求最小代价,不能覆盖则输出-1。
现在看到网格而且数据范围小的基本上的是网络流黑白染色啊。。(废话你在做网络流的题啊)
其实这道题和之前那个只用环覆盖的很像,只不过这里可以用路径。之前我们考虑的是每个点都会被贯穿,也就说度数会是2,所以当初那道题我们用的是二分图跑费用流,但这里有路径,怎么办?
首先图的基本关系很简单,相邻点之间连普通的容量1,费用0就好了。然后我们考虑强制要让每个点被贯穿,黑白染色后,用下限去限制,S向黑点连下限为2的边,白点向T连下限为2的边。问题来了,有的方案是有路径的,路径的端点并没有被贯穿,这怎么整?
巧妙之处来了。对于端点,我们现在的问题是多了流量,怎么办?把它直接导去就完了。也就是说,我们对于边界上的黑点,向T连一条无下限,上限为1,费用为1的边,白色同理。为什么巧妙呢,这不但解决了端点度数为1的问题,而且一旦出现这种情况,就说明出现了路径,对答案产生贡献,我们再加上费用来记录,跑最小费用可行流就完了。答案记得除2,因为头尾算了两次。判断有无解看有无可行流就好了。
#include<bits/stdc++.h>
using namespace std;
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;
}
#define INF 1e9
#define N 505
#define in ini
#define id(i,j) (((i)-1)*m+(j))
const int dir[][]={,,,-,,,-,};
int ans,n,m,head[N],cnt,d[N],a[N],p[N],S,SS,T,TT,TOT,in[N];
char st[][];
bool vis[N];
queue<int>q;
struct edges{
int fr,to,cap,flow,cost,next;
}e[*N]; inline void insert(int u,int v,int f,int c){
e[cnt]=(edges){u,v,f,,c,head[u]};head[u]=cnt++;
e[cnt]=(edges){v,u,,,-c,head[v]};head[v]=cnt++;
}
inline bool spfa(){
memset(d,0x3f,sizeof(d));
d[S]=; a[S]=INF; q.push(S);
while(!q.empty()){
int x=q.front(); q.pop(); vis[x]=;
for(int i=head[x];i>=;i=e[i].next)
if(d[e[i].to]>d[x]+e[i].cost && e[i].flow<e[i].cap){
d[e[i].to]=d[x]+e[i].cost; p[e[i].to]=i;
a[e[i].to]=min(a[x],e[i].cap-e[i].flow);
if(!vis[e[i].to]) vis[e[i].to]=,q.push(e[i].to);
}
}
return d[T]<INF;
}
inline void mincf(){
ans+=a[T]*d[T]; TOT-=a[T];
int u=T;
while(u!=S){
e[p[u]].flow+=a[T];
e[p[u]^].flow-=a[T];
u=e[p[u]].fr;
}
}
int main(){
memset(head,-,sizeof(head));
while(scanf("%s",st[++n]+)!=EOF); n--;
m=strlen(st[]+);
SS=; TT=n*m+; S=TT+; T=TT+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(st[i][j]=='#') continue;
if((i+j)&){
if(i== || i==n || j== || j==m) insert(SS,id(i,j),,);
in[TT]+=; in[id(i,j)]-=;
}else{
if(i== || i==n || j== || j==m) insert(id(i,j),TT,,);
in[SS]-=; in[id(i,j)]+=;
for(int k=;k<;k++){
int tx=i+dir[k][],ty=j+dir[k][];
if(tx< || tx>n || ty< || ty>m || st[tx][ty]=='#') continue;
insert(id(i,j),id(tx,ty),,);
}
}
}
insert(TT,SS,INF,);
for(int i=SS;i<=TT;i++){
if(in[i]>) insert(S,i,in[i],),TOT+=in[i];
if(in[i]<) insert(i,T,-in[i],);
}
while(spfa()) mincf();
if(!TOT) printf("%d\n",ans/);
else puts("-1");
return ;
}
bzoj4213: 贪吃蛇的更多相关文章
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- JavaScript-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- juery实现贪吃蛇的游戏
今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
- 原生JS制作贪吃蛇小游戏
感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...
随机推荐
- No module named 'urllib2'
import urllib2 response = urllib2.urlopen('http://www.baidu.com/') html = response.read() print html ...
- spring定时任务(转载)
在springMVC里使用spring的定时任务非常的简单,如下: (一)在xml里加入task的命名空间 xmlns:task="http://www.springframework.or ...
- IPMI
ipmitool -I lanplus -H 10.79.62.64 -U admin -P Nbv12345 [chassis power soft]/[raw 6 2 5] ipmiutil [r ...
- 超炫数字特效动画AE模板
下载方式: 网盘地址+迅雷地址+迅雷地址+备份地址 <ignore_js_op> 本AE模板是由Videohive机构出品的超炫数字特效动画AE模板,Videohive The Numbe ...
- HDU 5980 Find Small A(寻找小A)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- s
echo. 输出空行 echo; 输出空行 请求用户输入 set /p LOG_PATH=请输入log绝对路径: http://159.20.127:9009/gamesdk/doroot.jsp ...
- 个人博客作业Week3
一.调研 下载并使用,按照描述的bug定义,找出几个功能性的比较严重的bug.至少两个.用专业的语言描述(每个bug 不少于 40字),如有必要,可以配图. 电脑用户未登录就能使用单词本功能,万一是用 ...
- iframe布局
代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...
- 进fastreboot
1.红米1s 关机后,开机键+音量键下 同时按 2.红米note 关机后,开机键+音量键上 同时按 3. 4. 5.
- json.stringfy()和json.parse()
json.stringfy()将对象.数组转换成字符串:json.parse()将字符串转成json对象. json.stringfy(): 语法: JSON.stringify(value [, ...