题意:给定一个网格,有一些格子是障碍不用管,剩余的是空地,你要用一些起点和终点在边界上的路径或环来完全覆盖掉空地,如果使用第一种,会付出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: 贪吃蛇的更多相关文章

  1. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  3. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  4. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  5. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  6. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  7. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  8. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  9. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

随机推荐

  1. table表格在设置文字垂直居中后,在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行

    table设置了垂直居中后在表格显示相同排列的数据(比如:testtesttesttsttesttesstestse很多的test)时此表格不能换行, 此时会导致table会把页面撑的很宽,导致表格后 ...

  2. Android first --- 单元测试框架junit

    #单元测试junit* 定义一个类继承AndroidTestCase,在类中定义方法,即可测试该方法 * 在指定指令集时,targetPackage指定你要测试的应用的包名 <instrumen ...

  3. Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel

    Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel 1.MySQL安装[安装 MariaDB]MariaDB是MySQL的一个分支首 ...

  4. css样式表(四)

    ******* CSS 常用属性 ********* [font] font 设置或检索对象中的文本特性.该属性是复合属性. 使用第一种声明方式参数必须按照如上的排列顺序,且font-size和fon ...

  5. 头一次试验angularjs

    <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>angular< ...

  6. GOLANG 基本数据类型 整型

    基本数据类型-整型 种类     有符号(负号)      int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...

  7. [Python]实现简单决策树

    基本思路: 通过香农熵来决定每一层使用哪一种标签做分类,分类后,通过多数表决法来决定该层两个节点的类别.每次消耗一个标签,所以一共需要递归"标签个数"层. # -*- coding ...

  8. div盒子中子元素(子元素可能是盒子, 图片) 中居中的三种方法

  9. sql:sum(value)与count(letter),当用户不存在时查询到的值

    SELECT sum(value) FROM invoice where username='yueer' SELECT count(letters) FROM invoice where usern ...

  10. solar system by HTML5

    solar system by HTML5 星际穿越感觉很炫酷啊,网易貌似做了个专题在朋友圈挺火的.用canvas模拟太阳系,嗯,不错昂! 代码及效果 See the Pen GgpRjN by Na ...