https://darkbzoj.cf/problem/4213

https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩了存个代码

一条对答案有贡献的蛇一定有两个点在边界上且这两个点都只连了一条边,这条蛇上的其他点一定都连了两条边。

把格子按照如国际象棋棋盘的样式黑白填充,那么一条蛇是一条链(或者环),链上的点黑白交错。

对每个白点匹配两个相邻的黑点(黑白填充是为了方便建图(类似于二分图匹配)),只能匹配一个相邻点的点的数量的最小值/2就是最少的有贡献的蛇的数量。

所以建图为

s -> 白 流量2 费用0 上下界2

黑 -> t 流量2 费用0 上下界2

白 -> 相邻黑 流量1费用0

边缘白 -> t 流量1费用1

s -> 边缘黑 流量1费用1

改造成上下界的就可以了。同这道题→BZOJ2055 80人环游世界

 
 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
int n=,m=,mx=,ss=,tt=,S=,T=,z;
char ch[][];
struct nod{
int y,v,co,nex;
}e[maxn];
int head[]={},tot=;
int d[]={},id[][]={},ans=;
void init(int x,int y,int v,int co){
e[++tot].y=y;e[tot].v=v;e[tot].co=co;e[tot].nex=head[x];head[x]=tot;
e[++tot].y=x;e[tot].v=;e[tot].co=-co;e[tot].nex=head[y];head[y]=tot;
}
int dis[];bool vis[]={};
queue<int>q;
bool SPFA(){
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
int tn=dis[];
q.push(S);dis[S]=;vis[S]=;
while(!q.empty()){
int x=q.front(),y;q.pop();vis[x]=;
for(int i=head[x];i;i=e[i].nex){
y=e[i].y;
if(e[i].v>&&dis[y]>dis[x]+e[i].co){
dis[y]=dis[x]+e[i].co;
if(!vis[y]){vis[y]=;q.push(y);}
}
}
}
return dis[T]!=tn;
}
int dfs(int x,int flo){
if(x==T){
ans+=dis[x]*flo;return flo;
}vis[x]=;
int liu=,tv,y;
for(int i=head[x];i;i=e[i].nex){
y=e[i].y;
if(vis[y]||dis[y]!=dis[x]+e[i].co||e[i].v<=)continue;
tv=dfs(y,min(flo-liu,e[i].v));
liu+=tv;e[i].v-=tv;e[i^].v+=tv;
if(liu==flo)break;
}
return liu;
}
bool Check(int x,int y){if(x>=&&x<=n&&y>=&&y<=m&&ch[x][y]!='#')return ;return ;}
void Buildedge(){
for(int i=;i<=n;++i) for(int j=;j<=m;++j) id[i][j]=(i-)*m+j;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(ch[i][j]=='#')continue;
if((i+j)&){
d[ss]-=;d[id[i][j]]+=;
if(Check(i-,j))init(id[i][j],id[i-][j],,);
if(Check(i,j-))init(id[i][j],id[i][j-],,);
if(Check(i+,j))init(id[i][j],id[i+][j],,);
if(Check(i,j+))init(id[i][j],id[i][j+],,);
}
else {d[tt]+=;d[id[i][j]]-=;}
}
}
for(int i=;i<=tt;i++){
if(d[i]>)init(S,i,d[i],);
if(d[i]<) init(i,T,-d[i],);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(i==||j==||i==n||j==m){
if(ch[i][j]=='#')continue;
if((i+j)&)init(id[i][j],tt,,);
else init(ss,id[i][j],,);
}
}
}
init(tt,ss,mx,);
}
int main(){
//freopen("a.in","r",stdin);
n=;
while(~scanf("%s",ch[n]+))++n;
n--;
for(int i=;;++i){m=i-;if(ch[][i]!='.'&&ch[][i]!='#')break;}
mx=n*m;ss=mx+;tt=ss+;S=tt+;T=S+;
Buildedge();
while(SPFA()){memset(vis,,sizeof(vis));dfs(S,mx);}
int f=;
for(int i=head[S];i;i=e[i].nex)if(e[i].v)f=;
if(f)printf("%d\n",ans/);
else printf("-1\n");
return ;
}

BZOJ 4213 贪吃蛇 上下界费用流 网络流的更多相关文章

  1. BZOJ 4108: [Wf2015]Catering [上下界费用流]

    4108: [Wf2015]Catering 题意:有一家装备出租公司收到了按照时间顺序排列的n个请求. 这家公司有k个搬运工.每个搬运工可以搬着一套装备按时间顺序去满足一些请求.一个搬运工从第i个请 ...

  2. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  3. BZOJ 3876: [Ahoi2014]支线剧情 [上下界费用流]

    3876: [Ahoi2014]支线剧情 题意:每次只能从1开始,每条边至少经过一次,有边权,求最小花费 裸上下界费用流...每条边下界为1就行了 注意要加上下界*边权 #include <io ...

  4. BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)

    题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...

  5. BZOJ 3876 支线剧情 | 有下界费用流

    BZOJ 3876 支线剧情 | 有下界费用流 题意 这题题面搞得我看了半天没看懂--是这样的,原题中的"剧情"指的是边,"剧情点"指的才是点. 题面翻译过来大 ...

  6. BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)

    虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的.那么在摧毁据点x的过程中,其只能经过编号小于x的点.并且这样一定合法,因为可以控制其他人先去摧毁所经过的点.那 ...

  7. 【BZOJ2055】80人环游世界 有上下界费用流

    [BZOJ2055]80人环游世界 Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个 ...

  8. 【BZOJ3876】[Ahoi2014]支线剧情 有上下界费用流

    [BZOJ3876][Ahoi2014]支线剧情 Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩 ...

  9. 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...

随机推荐

  1. Hibernate5笔记1--Hibernate简介和第一个程序

    Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...

  2. oracle关键字作为字段名使用方法

    有时我们在定义字段名及别名时所用名与oracle关键字同名,这时该如何处理呢? 其实很简单,只要在此关键字加上"",如"group" SQL> DROP ...

  3. imperva命令行查看流量值大小

    watch -d -n 1 /proc/hades/status echo clear > /proc/hades/status     //清除这些记录

  4. Docker技术这些应用场景【转】

    场景一:节省项目环境部署时间 1.单项目打包 每次部署项目到测试.生产等环境,都要部署一大堆依赖的软件.工具,而且部署期间出现问题几率很大,不经意就花费了很长时间. Docker主要理念就是环境打包部 ...

  5. 大数据系列之数据仓库Hive中分区Partition如何使用

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  6. spring学习之三 数据库操作jdbcTemplate

    概念 jdbcTemplate就Spring对数据库持久化技术的实现,通过它可以对数据库进行CRUD等操作. JDBCTemplate和代码实现 public void jdbcadd() { Dri ...

  7. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  8. Luogu P1535 【游荡的奶牛】

    搜索不知道为什么没有人写bfs觉得挺像是标准个bfs的 状态因为要统计次数,不能简单地跳过一个被经过的点这样的话,状态量会爆炸采用记忆化设dp[i][j][k]表示在第k分钟到达点(i,j)的方案数以 ...

  9. JAVA复习笔记:内存结构和类加载

    Part1:JVM内存结构 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出 ...

  10. MS-SQL2005服务器登录名、角色、数据库用户、角色、架构的关系

    MS SQL2005对2000进行了很大的改进,而用户关系这部分也变得相当复杂了,很多朋友都对此一知半解!下面,我将把我应用中总结的和大家分享下,先从概念入手,希望对不理解的朋友有点提示. 今天我们要 ...