贪吃蛇(bzoj 4213)
Description
Input
Output
Sample Input
.#.##.
.#....
....#.
.##.#.
......
Sample Output
/*
上下界费用流,建图很诡异。
考虑一条不构成环的蛇,除了头尾之外的点,每个点都与两个点相连。
而环形蛇则所有点都与两个点相连。
所以我们对矩阵黑白染色.建立源点s,汇点t。
s向所有白点连容量为2,费用为0的边,表示这个点需要与两个点相连。
所有黑点向t连容量为2,费用为0的边,表示两个点需要与这个点相连。
这里的容量为2是指容量必须为2,需要上下界来限定。
每个白点向周围的黑点连容量为1,费用为0的边,表示这个点可以和周围的点形成蛇。
这里的容量并不要求一定是1,不需要用上下界来限定。
每个边界上的白点向t连容量为1,费用为1的边,表示形成了一条不成环的蛇。
s向每个边界上的黑点连容量为1,费用为1的边,表示形成了一条不成环的蛇。
然后用有源有汇有上下界的费用流处理即可。
注意每条蛇会在头和尾各算一次,所以最后答案需要除2。
(题解源于:http://blog.csdn.net/sunshinezff/article/details/51824068)
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define N 310
#define inf 1000000000
using namespace std;
int head[N],dis[N],inq[N],fa[N],d[N],n,m,cnt=,SS,TT,S,T,ans;
int dx[]={,,,-};
int dy[]={,-,,};
struct node{int v,f,w,pre;}e[N*];
char ch[N][N];
queue<int> q;
void add(int u,int v,int f,int w){
e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
for(int i=;i<=T;i++) dis[i]=inf;
q.push(S);dis[S]=;
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=head[u];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
fa[e[i].v]=i;
if(!inq[e[i].v]){
q.push(e[i].v);
inq[e[i].v]=;
}
}
}
return dis[T]!=inf;
}
void updata(){
int i=fa[T],x=inf;
while(i){
x=min(x,e[i].f);
i=fa[e[i^].v];
}
i=fa[T];
while(i){
e[i].f-=x;
e[i^].f+=x;
i=fa[e[i^].v];
}
ans+=x*dis[T];
}
bool check(){
for(int i=head[S];i;i=e[i].pre)
if(e[i].f) return false;
return true;
}
int hao(int x,int y){return (x-)*m+y;}
int main(){
int tot=;
while(scanf("%s",ch[n+]+)!=EOF) n++;
m=strlen(ch[]+);SS=n*m+;TT=SS+;S=TT+;T=S+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(ch[i][j]=='#') continue;
if(i+j&){
if(i==||j==||i==n||j==m) add(hao(i,j),TT,,);
d[SS]-=;d[hao(i,j)]+=;
for(int k=;k<;k++){
int x=i+dx[k],y=j+dy[k];
if(x<||x>n||y<||y>m||ch[x][y]=='#') continue;
add(hao(i,j),hao(x,y),,);
}
}
else {
if(i==||j==||i==n||j==m) add(SS,hao(i,j),,);
d[TT]+=;d[hao(i,j)]-=;
}
}
for(int i=;i<=TT;i++)
if(d[i]>) add(S,i,d[i],);
else if(d[i]<) add(i,T,-d[i],);
add(TT,SS,inf,);
while(spfa()) updata();
if(!check()) printf("-1");
else printf("%d",ans/);
return ;
}
贪吃蛇(bzoj 4213)的更多相关文章
- 【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 ...
随机推荐
- HTML5/CSS3 第一章基础
HTML5/CSS3基础 1. HTML 1.1 什么是HTML HTML是用来制作网页的标记语言 HTML是Hypertext Markup Language的英文缩写,即超文本标记语言 HTML语 ...
- lnmp启用pathinfo并隐藏index.php
编辑如下区段: location ~ [^/]\.php(/|$) { # comment try_files $uri =404; to enable pathinfo try_files $uri ...
- Python知识点入门笔记——特色数据类型(集合)
集合是一种不重复的无序集 集合用花括号来定义{} 集合和字典一样,里面的顺序是无序的,{1,2,3}和{3,2,1}是相等的 集合的元素不可重复,也就是说{1,2,2,3}是不存在的,应该写为{1,2 ...
- Neon Lights in Hong Kong【香港霓虹灯】
Neon Lights in Hong Kong Neon is to Hong Kong as red phone booths are to London and fog is to San Fr ...
- HUD:2896-病毒侵袭
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- Diycode开源项目 MyTopicActivity分析
1.总体浏览效果及布局分析 1.1.看一下我的帖子预览效果 1.2.然后看一下我的收藏预览效果 1.3.归纳一下 所以我的帖子和我的收藏可以共用同一个类. 布局效果几乎一样,只是用户的选择不同. 所以 ...
- Maya
建立酒杯的方法(CV曲线) surface(曲面)-- creat cv curve tool-- control vertex(调整图形)[再次creat cv建立厚度,只需要建立酒杯的上口]--- ...
- js中123==123为false的问题--写成123=="123"即可解决问题
项目中遇到过一个问题,js拿到后台返回的一个数字,在if中判断时,出现类似123==123为false的结果, 初步分析原因,应该是返回的是string类型的,但拿来比较的是个number类型的,所以 ...
- Python框架之Django学习笔记(七)
标签 eif/else {% if %} 标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% endif %} 之间的 ...
- Appium的三种等待时间设置方法
#三种appium设置等待时间的方法 #作者:Mr.Dantes #参考了网上的资料,然后进行了梳理 #第一种 sleep(): 设置固定休眠时间. python 的 time 包提供了休眠方法 ...