【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 58 Solved: 24
[Submit][Status][Discuss]
Description


Input
Output
Sample Input
.#.##.
.#....
....#.
.##.#.
......
Sample Output
HINT
Source
Solution
感觉是插头DP或者费用流...立马把插头DP否了
网格基本上得先黑白染色
感觉环状蛇中每个点一定与两个点相连,非环蛇只有头尾不合两个点相连,所以实际上要算的就是和一个点相连的
S-->白点,容量2 : 上下界都是2 费用为0
黑点-->T,容量2: 上下界都是2 费用同样为0
表示这个点需要和别的两个点相连
然后白点向四周黑点扩展出一条边 容量为1 费用为0
这样就是环状蛇的建图(显然环蛇不计入答案,所以费用全部置成0)
然后特判边界情况,边界上的白点-->T 费用1 容量1 表示非环蛇的情况
然后跑上下界最小费用流,ans/2即为答案,因为非环蛇的头尾都被累计,相当于1条蛇贡献2,所以除二即可
上下界最小费用流?理论什么的忘记了。。。
实现起来就是用超级源汇替代原来的源汇,再由次级汇连次级源INF,然后跑超级源汇之间的费用流
无解按照特有判定,S出来的边应该全都满流,否则无解
Code
- #include<iostream>
- #include<algorithm>
- #include<cmath>
- #include<cstring>
- #include<cstdio>
- #include<queue>
- using namespace std;
- inline int read()
- {
- int x=,f=; char ch=getchar();
- while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
- while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
- return x*f;
- }
- #define MAXM 100010
- #define MAXN 10010
- int N,M,cas;
- #define mN 15
- #define mM 15
- char G[mN][mM];
- struct EdgeNode{int next,to,cap,cost;}edge[MAXM];
- int head[MAXN],cnt=;
- inline void AddEdge(int u,int v,int w,int c) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w; edge[cnt].cost=c;}
- inline void InsertEdge(int u,int v,int w,int c) {AddEdge(u,v,w,c); AddEdge(v,u,,-c);}
- int dis[MAXN],S,T,s,t,MinCost; bool mark[MAXN];
- #define INF 0x7fffffff
- bool spfa()
- {
- queue<int>q; memset(mark,,sizeof(mark));
- for (int i=S; i<=T; i++) dis[i]=INF;
- q.push(T); dis[T]=; mark[T]=;
- while (!q.empty())
- {
- int now=q.front(); q.pop(); mark[now]=;
- for (int i=head[now]; i; i=edge[i].next)
- if (edge[i^].cap && dis[edge[i].to]>dis[now]+edge[i^].cost)
- {
- dis[edge[i].to]=dis[now]+edge[i^].cost;
- if (!mark[edge[i].to])
- q.push(edge[i].to),mark[edge[i].to]=;
- }
- }
- return dis[S]!=INF;
- }
- int dfs(int loc,int low)
- {
- mark[loc]=;
- if (loc==T) return low;
- int w,used=;
- for (int i=head[loc]; i; i=edge[i].next)
- if (edge[i].cap && !mark[edge[i].to] && dis[edge[i].to]==dis[loc]-edge[i].cost)
- {
- w=dfs(edge[i].to,min(low-used,edge[i].cap));
- edge[i].cap-=w; edge[i^].cap+=w; used+=w; MinCost+=w*edge[i].cost;
- if (used==low) return low;
- }
- return used;
- }
- int zkw()
- {
- int tmp=;
- while (spfa())
- {
- mark[T]=;
- while (mark[T])
- memset(mark,,sizeof(mark)),tmp+=dfs(S,INF);
- }
- return tmp;
- }
- bool Judge() {bool f=; for (int i=head[S]; i; i=edge[i].next) if (edge[i].cap) {f=;break;} return !f;}
- inline bool Check(int x,int y) {if (x>= && x<=N && y>= && y<=M && G[x][y]!='#') return ; return ;}
- int D[mN*mM],id[mN][mM],col[mN][mM];
- void BuildGraph()
- {
- S=; T=N*M+; s=N*M+; t=N*M+; int idd=;
- for (int i=; i<=N; i++)
- for (int j=; j<=M; j++)
- id[i][j]=++idd,col[i][j]=(i+j)&;
- for (int i=; i<=N; i++)
- for (int j=; j<=M; j++)
- if (col[i][j])
- if (Check(i,j)) D[s]-=,D[id[i][j]]+=; else;
- else
- if (Check(i,j)) D[id[i][j]]-=,D[t]+=; else;
- for (int i=; i<=N; i++)
- for (int j=; j<=M; j++)
- if (col[i][j] && Check(i,j))
- {
- if (Check(i-,j)) InsertEdge(id[i][j],id[i-][j],,);
- if (Check(i,j-)) InsertEdge(id[i][j],id[i][j-],,);
- if (Check(i+,j)) InsertEdge(id[i][j],id[i+][j],,);
- if (Check(i,j+)) InsertEdge(id[i][j],id[i][j+],,);
- }
- for (int i=; i<=N; i++)
- for (int j=; j<=M; j++)
- if (i== || i==N || j== || j==M)
- if (col[i][j])
- if (Check(i,j)) InsertEdge(id[i][j],t,,); else;
- else
- if (Check(i,j)) InsertEdge(s,id[i][j],,); else;
- for (int i=; i<=t; i++)
- if (D[i]>) InsertEdge(S,i,D[i],);
- else
- if (D[i]<) InsertEdge(i,T,-D[i],);
- InsertEdge(t,s,INF,);
- }
- int tp;
- int main()
- {
- tp=; while (scanf("%s",G[tp]+)!=EOF) tp++;
- N=tp-,M=strlen(G[]+);
- BuildGraph();
- zkw();
- if (Judge()) {puts("-1"); return ;}
- printf("%d\n",MinCost>>);
- return ;
- }
什么垃圾读入方式,恶心!
【BZOJ-4213】贪吃蛇 有上下界的费用流的更多相关文章
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
- BZOJ 4213 贪吃蛇 上下界费用流 网络流
https://darkbzoj.cf/problem/4213 https://www.cnblogs.com/DaD3zZ-Beyonder/p/5733326.html 题目描述 dbzoj又崩 ...
- BZOJ 2055: 80人环游世界(有上下界的费用流)
题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ...
- BZOJ2055 80人环游世界 网络流 费用流 有源汇有上下界的费用流
https://darkbzoj.cf/problem/2055 https://blog.csdn.net/Clove_unique/article/details/54864211 ←对有上下界费 ...
- BZOJ 3876: [Ahoi2014]支线剧情 带下界的费用流
3876: [Ahoi2014]支线剧情 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3876 Description [故事背景] 宅 ...
- Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)
ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡 ...
- 【上下界网络流 费用流】bzoj2055: 80人环游世界
EK费用流居然写错了…… Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团 ...
- UvaL-7670 上下界可行费用流
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...
- BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流
题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...
随机推荐
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Nginx 启用 https
在nginx.conf中增加新server配置 server { listen ; server_name www.some.com; ssl on; ssl_certificate sslkey/s ...
- css position, display, float 内联元素、块级元素
position属性:position属性指出一个元素的定位方法.有4种可能值:static, relative, absolute or fixed: static:默认值,元素按照在文档流中出现的 ...
- jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position
定位应用:点击一个按钮,然后在按钮的右边弹出一个提示框 1,提示框相对于屏幕进行定位,那么使用offset来取得当前按钮相对于body的top和left,然后通过$('body').prepend(t ...
- ios开发--多台电脑共用一个开发证书的方法
Xcode5 以前的操作步骤是: idp证书如何给另一台机子使用 先在原电脑上用Xcode->Windows->Organizer, 再点击Developer profile, 在其最下面 ...
- c#描述异常处理语句try、catch、finally执行时的相互关系
try里面是执行代码,其中的代码"可能"产生异常. catch是对产生异常后的处理代码,可以抛出异常,也可以显示异常,也可以弹出某中提示,总之catch里是任何代码都行,如果你知道 ...
- Tree Traversals
Tree Traversals 原题链接 常见的二叉树遍历的题目,根据后序遍历和中序遍历求层次遍历. 通过后序遍历和中序遍历建立起一棵二叉树,然后层序遍历一下,主要难点在于树的建立,通过中序遍历和后序 ...
- QT 对话框二
QMessageBox类 information()函数,主要是提示功能,不需要用户选择 StandardButton QMessageBox::information ( QWidget *pare ...
- spring 3.2.x + struts2 + mybatis 3.x + logback 整合配置
与前面的一篇mybatis 3.2.7 与 spring mvc 3.x.logback整合 相比,只是web层的MVC前端框架,从spring mvc转换成struts 2.x系列,变化并不大 一. ...
- PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)
主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:57:18 大家好,今天我们讲一下第14章combining models,这一章是联合模型,通过将多个模型以某种形式 ...