agc026F Lotus Leaves
题目链接
题目大意
一个n*m的网格上有一些点,一个点可以跳到与其同一行或同一列的点上。给定起点和终点。
求要使起点不能跳到终点,最少撤走几个点。
\(n,m\leq 100\)
解题思路
考虑将能够互相到达的点之间连边,题目要求即使删去尽可能少的点使图不连通。
十分套路地把一个点拆成一个入点和出点,之间连一条流量为1的边,删去这个点即使割去这条边。
然后就是网络流板子了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cstring>
#define N 40010
#define M N*100
#define N1 110
#define ll long long
#define inf 1000000000
using namespace std;
struct node{
int nxt,to;
ll f;
}road[M];
int head[N],cur[N],cnt=1;
void add(int u,int v,ll f)
{
road[++cnt]=(node){head[u],v,f};
head[u]=cnt;
road[++cnt]=(node){head[v],u,0};
head[v]=cnt;
}
queue<int>q;
int dep[N];
bool bfs(int s,int t)
{
memcpy(cur,head,sizeof(cur));
memset(dep,127,sizeof(dep));
dep[s]=0;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=road[i].nxt)
if(road[i].f>0)
{
int v=road[i].to;
if(dep[v]>=inf)
{
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t]<=inf;
}
ll dfs(int u,int t,ll flow)
{
if(u==t || !flow) return flow;
ll ans=0;
for(int i=cur[u];i;i=road[i].nxt)
{
cur[u]=i;
int v=road[i].to,f=0;
if(dep[v]==dep[u]+1 && (f=dfs(v,t,min(flow,road[i].f))))
{
flow-=f;
ans+=f;
road[i].f-=f;
road[i^1].f+=f;
if(!flow) break;
}
}
return ans;
}
ll dinic(int s,int t)
{
ll ans=0;
while(bfs(s,t)) ans+=dfs(s,t,inf);
return ans;
}
int n,m;
int id(int x,int y){return (x-1)*m+y;}
int ids(int x,int o){return x*2+o;}
void add_e(int x,int y)
{
add(ids(x,1),ids(y,0),inf);
add(ids(y,1),ids(x,0),inf);
}
char str[N1][N1];
int main()
{
scanf("%d%d",&n,&m);
int s=(n*m)*2+2,t=s+1;
for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(str[i][j]!='.')
{
for(int k=i+1;k<=n;k++)
if(str[k][j]!='.')
add_e(id(i,j),id(k,j));
for(int k=j+1;k<=m;k++)
if(str[i][k]!='.')
add_e(id(i,j),id(i,k));
if(str[i][j]=='S')
add(s,ids(id(i,j),0),inf),add(ids(id(i,j),0),ids(id(i,j),1),inf);
else if(str[i][j]=='T')
add(ids(id(i,j),1),t,inf),add(ids(id(i,j),0),ids(id(i,j),1),inf);
else add(ids(id(i,j),0),ids(id(i,j),1),1);
}
ll ans=dinic(s,t);
printf("%lld\n",ans>=inf?-1:ans);
return 0;
}
agc026F Lotus Leaves的更多相关文章
- AtCoder - 2568 Lotus Leaves
Problem Statement There is a pond with a rectangular shape. The pond is divided into a grid with H r ...
- 【ARC074F】Lotus Leaves 最小割
Description 给你一个n*m网格图,有起点荷叶和终点荷叶,有中转荷叶,其他的格子没东西,一个荷叶可以跳到同一行或者列的另一个荷叶.问最多删掉几个中转荷叶能让起点终点不连通.如果不行输出-1. ...
- AtCoder Regular Contest 074F - Lotus Leaves
$n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点.求至少删掉多少格子使得人跳不到终点. 首先S和T ...
- AtCoder Regular Contest 074 F - Lotus Leaves
题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...
- 【arc077f】AtCoder Regular Contest 074 F - Lotus Leaves
题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型 ...
- 【AtCoder】ARC074
ARC 074 C - Chocolate Bar 直接枚举第一刀横切竖切,然后另一块要求如果横切分成\(H / 2\)竖切分成\(W/2\)即可 #include <bits/stdc++.h ...
- Atcoder Regular-074 Writeup
C - Chocolate Bar 题面 There is a bar of chocolate with a height of H blocks and a width of W blocks. ...
- 2017年上海金马五校程序设计竞赛:Problem I : Frog's Jumping (找规律)
Description There are n lotus leaves floating like a ring on the lake, which are numbered 0, 1, ..., ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
随机推荐
- 算法导论2-4 O(nlgn)时间复杂度求逆序对
def mergesort(nums,le,ri): if le>ri-2: return 0 mi=le+(ri-le)//2 a=mergesort(nums,le,mi) b=merges ...
- leetcode 869. Reordered Power of 2
function reorderedPowerOf2(N) { var a1 = N.toString().split('') a1.sort((a, b) => a.localeCompare ...
- Django REST framework快速入门(官方文档翻译翻译)
开始 我们将创建一个简单的API来允许管理员用户查看和编辑系统中的用户和组. 项目设置 创建一个新的django项目,命名为:<tutorial>,然后创建一个新的应用程序(app),命名 ...
- Python 分发包中添加额外文件【新手必学】
在制作一个 Python 分发包时经常需要把一些文件添加到包中.最常见的例子是你希望通过 pip install命令安装 Python 包时会在 /etc/ 等目录下自动添加默认配置文件,由此可以 ...
- 计算机网络,HTTP - 头部中带X前缀的头部字段
HTTP中,什么是"X-" Prefix header? 例如 github API 的response headers有很多X前缀的头部: 查一下MDN文档: Custom pr ...
- Linux - cron - cron 表达式
概述 之前 cron 的补充 这次介绍下 表达式 背景 之前有说过 cron 这次说下 表达式 1. 准备 环境 os centos7 2. 模板文件 文件 位置 /etc/crontab 作用 系统 ...
- Java传(1)
____________________________去告诉世界,我已经横空出世了! 你好丫,世界! public class HelloWorld{ public static void main ...
- Bugku-CTF之文件包含2 (150)
Day37 文件包含2
- tmux的基本使用
tmux的基本使用 tmux 最近发现了一个linux终端非常好用的工具,可以快速分屏 使用方法 参考
- Git - 05. git log & git show
1. 概述 有了提交, 就必须有日志 日志用处很多, 这里我就不多说了 2. 项目日志 概述 查看当前分支的 提交记录 命令 普通查看 命令 > git log 显示 commit id 包括 ...