$n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点。求至少删掉多少格子使得人跳不到终点。

首先S和T同行或同列无解。

这不是裸的最小割嘛。。等会这复杂度不大对

优化:一行里的点要连来连去嘛,每个点都要向同行或同列的所有点连inf边嘛,那咱把这边聚一下,每行每列新开一个点,这一行的所有点连向代表这一行的点,代表这一行的点连向所有这一行的点,这样边从三次方变成了平方。可过。

还有一种建图方法:每行每列开一个点,把一个空地对应的行列连条边,起点向其行列连边,终点其行列向终点连边。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<time.h>
//#include<complex>
//#include<queue>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=; while ((c=getchar())<'' || c>'');
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s;
} //Pay attention to '-' and LL of qread!!!! int n,m;
#define maxn 400011
#define maxm 4000011
struct Edge{int to,next,cap,flow;};
struct Network
{
Edge edge[maxm]; int first[maxn],le,n;
void clear(int m) {le=; n=m;}
void in(int x,int y,int cap)
{Edge &e=edge[le]; e.to=y; e.cap=cap; e.flow=; e.next=first[x]; first[x]=le++;}
void insert(int x,int y,int cap) {in(x,y,cap); in(y,x,);}
int s,t,dis[maxn],cur[maxn],que[maxn],head,tail;
bool bfs()
{
memset(dis,,sizeof(dis)); dis[s]=;
head=; tail=; que[]=s;
while (head!=tail)
{
int now=que[head++];
for (int i=first[now];i;i=edge[i].next)
{
Edge &e=edge[i];
if (e.cap>e.flow && dis[e.to]==)
{
dis[e.to]=dis[now]+;
que[tail++]=e.to;
}
}
}
return dis[t];
}
int dfs(int x,int a)
{
if (x==t || !a) return a;
int flow=,f;
for (int &i=cur[x];i;i=edge[i].next)
{
Edge &e=edge[i];
if (dis[e.to]==dis[x]+ && (f=dfs(e.to,min(a,e.cap-e.flow)))>)
{
e.flow+=f; flow+=f;
edge[i^].flow-=f; a-=f;
if (!a) break;
}
}
return flow;
}
int Dinic(int s,int t)
{
this->s=s; this->t=t;
int ans=;
while (bfs())
{
for (int i=;i<=n;i++) cur[i]=first[i];
ans+=dfs(s,0x3f3f3f3f);
}
return ans;
}
}g; char mp[][]; int id[][]; int main()
{
// freopen("trade.in","r",stdin);
// freopen("trade.out","w",stdout);
n=qread(); m=qread();
for (int i=;i<=n;i++) scanf("%s",mp[i]+);
int sx,sy,tx,ty,s,t,tot=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) if (mp[i][j]!='.')
{
id[i][j]=++tot;
if (mp[i][j]=='S') sx=i,sy=j,s=tot;
if (mp[i][j]=='T') tx=i,ty=j,t=tot;
} if (sx==tx || sy==ty) {puts("-1"); return ;} g.clear(tot*+n+m);
for (int i=;i<=tot;i++) if (i!=s && i!=t) g.insert(i,i+tot,);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) if (id[i][j])
{
if (id[i][j]==s)
{
g.insert(s,tot*+i,0x3f3f3f3f);
g.insert(tot*+i,s,0x3f3f3f3f);
g.insert(s,tot*+n+j,0x3f3f3f3f);
g.insert(tot*+n+j,s,0x3f3f3f3f);
}
else
{
g.insert(id[i][j]+tot,tot*+i,0x3f3f3f3f);
g.insert(tot*+i,id[i][j],0x3f3f3f3f);
g.insert(id[i][j]+tot,tot*+n+j,0x3f3f3f3f);
g.insert(tot*+n+j,id[i][j],0x3f3f3f3f);
}
}
printf("%d\n",g.Dinic(s,t));
return ;
}

AtCoder Regular Contest 074F - Lotus Leaves的更多相关文章

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  3. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  4. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  5. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  6. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  7. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  8. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  9. AtCoder Regular Contest 097

    AtCoder Regular Contest 097 C - K-th Substring 题意: 求一个长度小于等于5000的字符串的第K小子串,相同子串算一个. K<=5. 分析: 一眼看 ...

随机推荐

  1. java读取clob字段的几种方法(转)

    http://blog.csdn.net/tanksyg/article/details/49927897 第一种 Clob clob = rs.getClob("remark") ...

  2. UVA 1625 Color Length 颜色的长度 (预处理+dp)

    dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费. 转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数 ...

  3. Bootstrap 响应式表格

    响应式表格 通过把任意的 .table 包在 .table-responsive class 内,您可以让表格水平滚动以适应小型设备(小于 768px).当在大于 768px 宽的大型设备上查看时,您 ...

  4. 总结:JavaScript异步、事件循环与消息队列、微任务与宏任务

    本人正在努力学习前端,内容仅供参考.由于各种原因(不喜欢博客园的UI),大家可以移步我的github阅读体验更佳:传送门,喜欢就点个star咯,或者我的博客:https://blog.tangzhen ...

  5. input动态模糊查询的实现方式

    最近在用jQuery实现动态模糊查询的时候,找了挺久都没有找到像Vue.js的watch属性这么好用的动态模糊查询方法.就分享一下目前遇到的坑和可以实现动态查询的几种方式. 1.jQuery的chan ...

  6. 如何用纯 CSS 创作一个记事本翻页动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qKOPGw 可交互视频教 ...

  7. 第一章 pyhton基础

    一 .pyhton2与python3的区别 在pyhton2中,其中编码默认使用的是ascii编码,输出格式为print"xxx",输入为raw_input(“请输入”),在整型中 ...

  8. I2C驱动框架(五)

    参考:I2C子系统之 adapter driver注册——I2C_dev_init() i2c的操作在内核中是当做字符设备来操作的,相关初始化在由i2c_dev_init函数来初始化. static ...

  9. 基于FTP服务器搭建yum源

    本例以CentOS6.8为试验对象,来搭建基于FTP服务器的yum源. 一.配置本地yum源 1.创建挂载目录/yum mkdir /yum 2.挂载镜像 mount -o loop  CentOS- ...

  10. Java单例模式简单实现

    代码 public class Singleton { private static Singleton singleton;//创建一个单例对象 public static Singleton ge ...