题目链接:

https://www.luogu.org/problemnew/show/P2472

分析:

这道题用最大流解决。

首先构建模型。

一根柱子可以跳入和跳出,于是拆成两个点:入点和出点。

每一根柱子的入点和出点连一条流量为高度的边,来限制蜥蜴跳入的次数。

当柱子a可以调到柱子b时,就从a的出点向b的入点连边,流量inf。

S向所有有蜥蜴的柱子的入点连边,流量为1

T表示地图外一点,当一根柱子能跳到地图外时,则出点向T连流量为inf的边。

然后跑最大流即可。

这里要注意数组的范围以及拆点。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#define inf 0x7fffffff
using namespace std;
int s,t,ans;
int d[1005];
struct edge
{
int to,val,rev;
edge(int _to,int _val,int _rev)
{
to=_to;
val=_val;
rev=_rev;
}
};
vector<edge>e[1005];
void add(int x,int y,int w)
{
e[x].push_back(edge(y,w,e[y].size()));
e[y].push_back(edge(x,0,e[x].size()-1));
}
bool bfs()
{
memset(d, -1, sizeof(d));
queue<int> q;
q.push(s);
d[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i].to;
if(d[y]==-1 && e[x][i].val)
{
q.push(y);
d[y]=d[x]+1;
}
}
}
if(d[t]==-1)
return 0;
else
return 1;
} int dfs(int x,int low)
{
if(x==t || low==0)
return low;
int totflow=0;
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i].to;
int rev=e[x][i].rev;
if(d[y]==d[x]+1 && e[x][i].val)
{
int a=dfs(y,min(low,e[x][i].val));
e[x][i].val-=a;
e[y][rev].val+=a;
low-=a;
totflow+=a;
if(low==0)
return totflow;
}
}
if(low!=0)
d[x]=-1;
return totflow;
} void dinic()
{
while(bfs())
{
ans+=dfs(s,inf);
}
}
int main()
{
int n,m,c,cnt=0;
char ss;
scanf("%d%d%d",&n,&m,&c);
s=0,t=n*m*2+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>ss;
if(ss>'0')
{
add((i-1)*m+j,(i-1)*m+j+n*m,ss-'0');
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>ss;
if(ss=='L')
{
add(s,(i-1)*m+j,1);
cnt++;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i+c>n||i-c<1||j+c>m||j-c<1)
{
add((i-1)*m+j+n*m,t,inf);
}
}
}
for(int x1=1;x1<=n;x1++)
{
for(int y1=1;y1<=m;y1++)
{
for(int x2=1;x2<=n;x2++)
{
for(int y2=1;y2<=m;y2++)
{
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=c*c)
{
add((x1-1)*m+y1+n*m,(x2-1)*m+y2,inf);
}
}
}
}
}
dinic();
printf("%d",cnt-ans);
return 0;
}

最新文章

  1. 【Junit 报错】Test class should have exactly one public zero-argument constructor和Test class can only have one constructor
  2. Badboy录制脚本参数化
  3. org.apache.commons.lang.StringUtils类
  4. tensorflow4
  5. Spring之@Configuration配置解析
  6. AndroidStudio支持新的NDK的操作使用
  7. Hibernate学习笔记(一):级联删除
  8. Java基础知识强化44:StringBuffer类之把数组拼接成指定格式的字符串的案例
  9. Angularjs,WebAPI 搭建一个简易权限管理系统
  10. (转)java并发之Executor
  11. bzoj 3261最大异或和
  12. Smobiler 4.4 更新预告 Part 1(Smobiler能让你在Visual Studio上开发APP)
  13. Flask插件wtforms、Flask文件上传和Echarts柱状图
  14. java程序内存监控
  15. Java程序编译和运行过程之 一个对象的生命之旅(类加载和类加载器)
  16. MySQL like用法
  17. POJ 1200:Crazy Search(哈希)
  18. IAM页面是在统一区分配的还是在混合区分配的?
  19. TCP的socket资源被耗尽的问题
  20. 指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

热门文章

  1. 龙芯GO!龙芯平台上构建Go语言环境指南
  2. Channel 9视频整理【1】
  3. 百度网盘web端项目总结
  4. 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)
  5. 桌面程序阻止Windows关机(使用Message.Result取得DefWindowProc API函数的返回值,非常重要)
  6. 三个臭皮匠,顶上一个诸葛亮——在Google Ideathon上Design Thinking分享
  7. java多线程之多生产者-多消费者
  8. MySQL8.0 DDL原子性特性
  9. spring cloud 系列第8篇 —— config+bus 分布式配置中心与配置热刷新 (F版本)
  10. centos6.5虚拟机配置Nat模式连接外网