贪吃蛇(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 ...
随机推荐
- React Native 初探
推荐文章 React Native 简介:用 JavaScript 搭建 iOS 应用 (1) React Native 简介:用 JavaScript 搭建 iOS 应用 (2) React Nat ...
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- jstl(c)标签
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...
- pycahrm git配置笔记
1. 在file - setting - plugins 中查看是否有github插件, 此处是用于处理插件位置
- 数据结构-二分查找(Binary Search)
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LIST_INIT_SIZE ...
- Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库
操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ...
- Xadmin后台管理系统搭建基于Django1.11.11+Python3.6
安装python及Django百度即可 主要介绍Xadmin安装 访问地址:https://github.com/sshwsfc/xadmin 下载 安装好之后,将xamdin目录复制到项目 我放在 ...
- vscode运行C/C++程序及配置
安装vscdoe,安装tdm-gcc-64编译器,这样可以自动把mingw的目录添加到环境变量中,其实安装其他编译器本版都可以,只要手动添加环境变量即可.平台win10-64位.此文参考了哔哩哔哩的配 ...
- MySQL基础6-分组查询
1.分组函数 需求20:查询所有商品平均零售价SELECT AVG(salePrice) FROM product 需求21:查询商品总记录数SELECT COUNT(id) count FROM p ...
- loj2042 「CQOI2016」不同的最小割
分治+最小割 看到题解的第一句话是这个就秒懂了,然后乱七八糟的错误.越界.RE-- #include <algorithm> #include <iostream> #incl ...