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. 一个罕见的MSSQL注入漏洞案例

    一个罕见的MSSQL注入漏洞案例 这里作者准备分享一个在去年Google赏金计划中发现的相当罕见漏洞,也是作者在整个渗透测试生涯中唯一一次遇到的. 目标网站使用了微软 SQL Server 数据库并且 ...

  2. 1 - django-介绍-MTV-命令-基础配置-admin

    目录 1 什么是web框架 2 WSGI 3 MVC与MTV模式 3.1 MVC框架 3.2 MTV框架 3.3 区别 4 django介绍 4.1 Django处理顺序 4.2 创建django站点 ...

  3. Centos7安装 mysql5.6.29 shell脚本

    有很多可以借鉴的地方,故转载: 创建脚本mysql.sh,直接运行sh mysql.sh !/bin/bash if [ -d /software ] ;then cd /software else ...

  4. aarch64_a1

    AGReader-1.2-16.fc26.aarch64.rpm 2017-02-14 07:01 50K fedora Mirroring Project ATpy-0.9.7-11.fc26.no ...

  5. 四、springcloud之服务调用Feign(二)

    一.Fegin的常见应用 Feign的Encoder.Decoder和ErrorDecoder Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder) ...

  6. docker stack 部署 filebeat

    =============================================== 2018/7/21_第3次修改                       ccb_warlock 更新 ...

  7. nodejs 接收上传的图片

    1.nodejs接收上传的图片主要是使用formidable模块,服务器是使用的express搭建. 引入formidable var formidable = require('./node_mod ...

  8. 32 Profiling Go Programs 分析go语言项目

    Profiling Go Programs  分析go语言项目 24 June 2011 At Scala Days 2011, Robert Hundt presented a paper titl ...

  9. 30 C? Go? Cgo!

    C? Go? Cgo! 17 March 2011 Introduction Cgo lets Go packages call C code. Given a Go source file writ ...

  10. MongoDB官方文档结构

    本文展示MongoDB 3.6.4.0的官方Server文档的结构图——一眼可见完整的知识脉络图.不过,MongoDB除了Server的文档外,还有DRIVERS.CLOUD.TOOLS.DUIDES ...