Description

给你一个n*m网格图,有起点荷叶和终点荷叶,有中转荷叶,其他的格子没东西,一个荷叶可以跳到同一行或者列的另一个荷叶。问最多删掉几个中转荷叶能让起点终点不连通。如果不行输出-1.

Input

​ 第一行是两个正整数R,CR,C

​ 接下来是一个R∗CR∗C的字符矩阵,第ii行第jj个字符为ai,jai,j

​ 若ai,j′.′ai,j′.′,那么这个格子是水面

​ 若ai,j′o′ai,j′o′,那么这个格子是一片荷叶

​ 若ai,j′S′ai,j′S′或者′T′′T′,那么这个格子是标记了S,TS,T的荷叶

Output

​ 如果没有解,那么输出-1

​ 否则输出最少需要删除的个数

Sample Input

Case 1:
3 3
S.o
.o.
o.T Case 2:
3 4
S...
.oo.
...T Case 3:
4 3
.S.
.o.
.o.
.T. Case 4:
10 10
.o...o..o.
....o.....
....oo.oo.
..oooo..o.
....oo....
..o..o....
o..o....So
o....T....
....o.....
........oo

Sample Output

Case 1:
2 Case 2:
0 Case 3:
-1 Case 4:
5

HINT

​ 1≤R,C≤1001≤R,C≤100

​ S,TS,T只出现一次

Sol

考察选手会不会写最大流算法。

对于每行和每列建一个点,然后S向S所在行和列对应的点连inf,T所在的行和列对应的点向T连inf,对于每个荷叶\((i,j)\),连边\(i->j+n,j+n->i\),之后跑最大流即可出解。

Code

#include <bits/stdc++.h>
using namespace std;
int n,m,S,T,cnt,inf=1e9,sx,sy,tx,ty,hed[1005],d[1005],nex[50005],to[50005],val[50005],ans;queue<int>q;char ch;
void add(int x,int y,int z)
{
to[cnt]=y;val[cnt]=z;nex[cnt]=hed[x];hed[x]=cnt++;
to[cnt]=x;val[cnt]=0;nex[cnt]=hed[y];hed[y]=cnt++;
}
bool bfs()
{
while(!q.empty()) q.pop();memset(d,0,sizeof(d));d[S]=1;q.push(S);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=hed[x];i!=-1;i=nex[i]) if(!d[to[i]]&&val[i]){d[to[i]]=d[x]+1;if(to[i]==T) return 1;q.push(to[i]);}
}
return 0;
}
int dfs(int x,int mf)
{
if(x==T) return mf;int tmp=mf;
for(int i=hed[x];i!=-1;i=nex[i]) if(d[to[i]]==d[x]+1&&val[i])
{
int k=dfs(to[i],min(val[i],tmp));
if(!k) d[to[i]]=0;
tmp-=k;val[i]-=k;val[i^1]+=k;
if(!tmp) break;
}
return mf-tmp;
}
int main()
{
scanf("%d%d",&n,&m);T=n+m+1;memset(hed,-1,sizeof(hed));
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{
cin>>ch;
if(ch=='S') add(S,i,inf),add(S,j+n,inf),sx=i,sy=j;
if(ch=='T') add(i,T,inf),add(j+n,T,inf),tx=i,ty=j;
if(ch=='o') add(i,j+n,1),add(j+n,i,1);
}
if(sx==tx||sy==ty) return puts("-1"),0;
while(bfs()) ans+=dfs(0,inf*2);
printf("%d\n",ans);
}

【ARC074F】Lotus Leaves 最小割的更多相关文章

  1. AtCoder - 2568 最小割

    There is a pond with a rectangular shape. The pond is divided into a grid with H rows and W columns ...

  2. AtCoder - 2568 Lotus Leaves

    Problem Statement There is a pond with a rectangular shape. The pond is divided into a grid with H r ...

  3. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  4. BZOJ-2127-happiness(最小割)

    2127: happiness(题解) Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1806  Solved: 875 Description 高一 ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  7. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  8. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

  9. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

随机推荐

  1. python's eithteenth day for me 面向对象——命名空间

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些明细称为类的属性. 而类有两种属性:静态属性和动态属性:   1,静态属性就是直接在类中定义的变量. 2,动态属性就是定义在类中的方 ...

  2. Python Twisted系列教程8:使用Deferred的诗歌下载客户端

    作者:dave@http://krondo.com/deferred-poetry/  译者:杨晓伟(采用意译) 可以从这里从头开始阅读这个系列. 客户端4.0 我们已经对deferreds有些理解了 ...

  3. XML注释与Description标签及Java:注解(Annotation)的关系

    NET中的规范标准注释(一) -- XML注释标签讲解 一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来 ...

  4. 微信小程序之wx.getLocation再次授权问题解决

    首先,在page外定义一个公共函数用于发送获取位置的请求 var getLocation = function (that) { wx.getLocation({ type: 'wgs84', suc ...

  5. Java面向对象-package import关键字

    Java面向对象-package import关键字 package包关键字,在java中,有包的概念,主要是用来归类 分类作用: 便于项目的开发和维护: 这里截取随便截取一个我最近在开发的一个开源工 ...

  6. 「小程序JAVA实战」运行微信官方demo(四)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-04/ 微信官方小程序的demo 介绍 https://mp.weixin.qq.com/cgi-b ...

  7. vue中使用markdown富文本,并在html页面中展示

    想给自己的后台增加一个markdown编辑器,下面记录下引用的步骤 引入组件mavon-editor 官网地址:https://github.com/hinesboy/mavonEditor // 插 ...

  8. BeX5 常见问题解决办法

    1.获取当前Activity的名称 Activity activity = ProcessUtils.getActivityInProcessContext(); String activityNam ...

  9. Mac os JAVA 开发环境配置简述

    本文原文来源:http://blog.csdn.NET/johnstrive/article/details/7791451 1.Mac 自带jdk1.6(本人的机器是这样至于新Mac自带的版本就不清 ...

  10. Android适配器Adapter的学习

    Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...