题目传送门

经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了。

由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量。

建图:

  1.建超级源和超级汇,设超级源连到每只蜥蜴的边容量为1,每个可以跳到外面的点连到超级汇的边的容量为maxlongint。

  2.对于每个点建一个虚点,连边到此虚点,边容量为该点石柱高度。对于每个可以互相跳到的点,建立容量为maxlongint的边。这样当前点到其他点的总容量为该点的石柱高度。(拆点)

然后跑一遍Dinic就好了。

注意用蜥蜴的总数减去最大流才是答案。

code:

/**************************************************************
Problem: 1066
User: yekehe
Language: C++
Result: Accepted
Time:40 ms
Memory:6380 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; int r,c,d,a[][],L;
string S; int head[],nxt[],W[],To[],cnt;
void add(int x,int y,int c)
{
W[cnt]=c;
To[cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
cnt++;
} int check(int x,int y,int fx,int fy)
{
return (x-fx)*(x-fx)+(y-fy)*(y-fy)<=d*d;
} int l[],dist[];
int BFS()
{
int tl=,hd=;
hd=tl=;
l[++tl]=;
memset(dist,-,sizeof dist);
dist[]=;
while(hd<tl){
int front=l[++hd];
for(int i=head[front];i!=-;i=nxt[i]){
if(dist[To[i]]==- && W[i]){
dist[To[i]]=dist[front]+;
l[++tl]=To[i];
}
}
}
return dist[r*c*+]!=-;
} int DFS(int now,int x)
{
if(now==r*c*+ || !x)return x;
int res=;
for(int i=head[now];i!=- && x;i=nxt[i]){
if(dist[now]+==dist[To[i]]&&W[i]){
int DK=DFS(To[i],min(x,W[i]));
W[i]-=DK;W[i^]+=DK;
x-=DK;res+=DK;
}
}
if(!res)dist[now]=-;
return res;
} void Dinic()
{
int ans=;
while(BFS())
ans+=DFS(,2e9);
printf("%d",L-ans);
return ;
} int main()
{
// freopen("x.txt","r",stdin);
scanf("%d%d%d",&r,&c,&d);
memset(nxt,-,sizeof nxt);
memset(head,-,sizeof head);
register int i,j,k,h;
#define Size ( r*c )
#define fr ( (i-1)*c+j )
#define to ( (k-1)*c+h )
for(i=;i<=r;i++){
cin>>S;
for(j=;j<S.size();j++){
a[i][j+]=S[j]-'';
}
}
for(i=;i<=r;i++){
cin>>S;
for(j=;j<=S.size();j++){
if(S[j-]=='L'){
L++;//求蜥蜴总数
add(,fr,);
add(fr,,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(!a[i][j])continue;
add(fr,fr+Size,a[i][j]);
add(fr+Size,fr,);
for(k=;k<=r;k++)
for(h=;h<=c;h++){
if(i==k&&j==h)continue;
if(a[k][h]/*减少边的总量*/&&check(i,j,k,h)){
add(fr+Size,to,2e9);
add(to,fr+Size,);
}
}
}
for(i=;i<=r;i++)
for(j=;j<=c;j++){
if(i<=d || j<=d || r-i+<=d || c-j+<=d){
if(!a[i][j])continue;//减少边的总量
add(fr+Size,Size<<|,2e9);
add(Size<<|,fr+Size,);
}
}
Dinic();
return ;
}

最新文章

  1. Python ZIP 文件创建与读取
  2. 关于《selenium2自动测试实战--基于Python语言》
  3. 解决Ubuntu发热量大的问题
  4. Jquery分页功能
  5. 解析iOS开发中的FirstResponder第一响应对象
  6. work_queue 函数调用栈
  7. 入门训练 A+B问题
  8. HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)
  9. iOS多线程之NSThread使用
  10. 关于对象和this、new
  11. 0 and 1
  12. 修改jsp默认编码
  13. Java自学手记——struts2
  14. sql sever基本查询语句
  15. url加密,一般只对参数加密
  16. [Swift]LeetCode1028. 从先序遍历还原二叉树 | Recover a Tree From Preorder Traversal
  17. redis使用总结(二)(jedis使用)
  18. OpenCV(一):集成
  19. kubernetes 实战5_命令_Assign Pods to Nodes&amp;Configure a Pod to Use a ConfigMap
  20. 【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

热门文章

  1. C#图解教程读书笔记(第3章 类型、存储及变量)
  2. 使用Hibernate注解Annotations进行对象映射的异常处理
  3. AlexNet 分类 FashionMNIST
  4. 「bzoj4264 小C找朋友」
  5. luogu P4275 萃香的请柬
  6. PHP------XML
  7. Dos操作基础
  8. Fiddler学习基础(一)
  9. yolo2 anchor选择校招总结
  10. 说说application/x-www-form-urlencoded和application/json的区别