学了ISAP说我来做一道网络流的傻逼题吧然后自己变成了一个傻逼。。

De了很久的bug然后发现我从源点向每只蜥蜴连了INF的边,喵喵喵?

最近写博客好像比较敷衍,还是说一下。每个柱子拆点,源点向每个有蜥蜴的真点连1的边,每个真点向假点连石柱高的边,每个假点向它能到达的柱子的真点连INF的边,每个能跳出去的柱子向汇点连INF的边。

跑得比Dinic慢。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
const int maxn=20000+25;
const int INF=0x7fffffff;
int tot,r,c,D,s,t,n,d[maxn],fir[maxn],cur[maxn],cnt[maxn],p[maxn],a[maxn],is[maxn],ecnt=1;
char ss[50][50];
struct edge {int from,to,cap,flow,nxt;edge(){}edge(int from,int to,int cap,int flow,int nxt):from(from),to(to),cap(cap),flow(flow),nxt(nxt){}
}e[maxn*2];
void add(int u,int v,int w) {e[++ecnt]=edge(u,v,w,0,fir[u]);e[++ecnt]=edge(v,u,0,0,fir[v]);fir[u]=ecnt-1; fir[v]=ecnt;
}
queue<int>que;
void bfs() {for(int i=1;i<=n;i++) d[i]=n;d[t]=0; que.push(t);while(!que.empty()) {int x=que.front(); que.pop();for(int i=fir[x];i;i=e[i].nxt) if(d[e[i].to]==n&&e[i].flow==e[i].cap) {d[e[i].to]=d[x]+1;que.push(e[i].to);}}
}
int cal() {int res=INF;for(int x=t;x!=s;x=e[p[x]].from) res=min(res,e[p[x]].cap-e[p[x]].flow);for(int x=t;x!=s;x=e[p[x]].from) {e[p[x]].flow+=res;e[p[x]^1].flow-=res;}return res;
}
int Maxflow() {bfs();for(int i=1;i<=n;i++) cur[i]=fir[i],cnt[d[i]]++;int res=0;for(int x=s;d[x]<n;) {if(x==t) {res+=cal();x=s;}int ok=0;for(int &i=cur[x];i;i=e[i].nxt) if(d[e[i].to]+1==d[x]&&e[i].flow<e[i].cap){p[x=e[i].to]=i;ok=1;break;    }if(!ok) {cur[x]=fir[x]; int M=n;for(int i=fir[x];i;i=e[i].nxt) if(e[i].cap>e[i].flow){M=min(M,d[e[i].to]+1);}if(!(--cnt[d[x]])) break;cnt[d[x]=M]++;if(x!=s) x=e[p[x]].from;}}return res;
}
double dis(int x,int y,int xx,int yy) {return sqrt((double)(x-xx)*(x-xx)+(double)(y-yy)*(y-yy));}
void ADD(int x,int y) {for(int i=1;i<=r;i++)for(int j=1;j<=c;j++) if(i==x&&j==y) continue;else if(dis(x,y,i,j)<=(double)D) add(r*c+(x-1)*c+y,(i-1)*c+j,INF);add((x-1)*c+y,r*c+(x-1)*c+y,a[(x-1)*c+y]);if(min(x,r-x+1)<=D||min(y,c-y+1)<=D) add(r*c+(x-1)*c+y,t,INF);
}
void init() {scanf("%d%d%d",&r,&c,&D);s=r*c*2+1; t=r*c*2+2; n=t;for(int i=1;i<=r;i++) {for(int j=1;j<=c;j++) {char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();a[(i-1)*c+j]=ch-'0';}}for(int i=1;i<=r;i++) {for(int j=1;j<=c;j++) {char ch=getchar();while(ch!='.'&&ch!='L') ch=getchar();if(ch=='L') {tot++; add(s,(i-1)*c+j,1);}}}for(int i=1;i<=r;i++)for(int j=1;j<=c;j++) ADD(i,j);
}
void work() {printf("%d\n",tot-Maxflow());
}
int main()
{init();work();return 0;
}

View Code

转载于:https://www.cnblogs.com/Achenchen/p/7535695.html

BZOJ 1066[SCOI2007]蜥蜴相关推荐

  1. bzoj 1066: [SCOI2007]蜥蜴(最大流)

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4116  Solved: 2081 [Submit][Statu ...

  2. 1066. [SCOI2007]蜥蜴【最大流】

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...

  3. BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec   Memory Limit: 162 MB Submit: 2947   Solved: 1471 [ Submit][ S ...

  4. BZOJ1066: [SCOI2007]蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4506  Solved: 2305 [Submit][Statu ...

  5. [SCOI2007] 蜥蜴 (最大流)

    [SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...

  6. [SCOI2007]蜥蜴 (网格图经典四方向建边)

    题意: 在一个n*m的矩阵中,每个格子都有一定的高度,当高度为0时表示该格子不存在,现在这个矩阵中有若干只蜥蜴,每只蜥蜴跳到格子上时,该格子的高度会减一,每只蜥蜴可以跳跃直线距离不大于D的长度,问最少 ...

  7. 洛谷 - P2472 [SCOI2007]蜥蜴(最大流)

    题目链接:点击查看 题目大意:给出一个 n * m 的迷宫,每个位置都有一个耐久度,也就是至多经过 a[ i ][ j ] 位置 ( i , j ),现在迷宫中有一些蜥蜴,每一时刻在每一个位置至多有一 ...

  8. BZOJ 1070: [SCOI2007]修车(最小费用最大流)

    建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...

  9. BZOJ 1068: [SCOI2007]压缩

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1493  Solved: 941 [Submit][Status ...

最新文章

  1. python3模块文档_Python3模块-Python入门到精通
  2. 完美日记的微服务实践和优化思路
  3. 这里天刚黑,而家里都已经后半夜了
  4. python django mysql安装_Django+Nginx+uWSGI+Mysql搭建Python Web服务器
  5. Python+Opencv实现实时的条形码检测
  6. 文本检测算法新思路:基于区域重组的文本检测
  7. sscanf函数用法详解_「MOS考点详解」一道例题详解GETPIVOTDATA函数的用法
  8. php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理
  9. 机器学习笔记(五)回归模型
  10. 原备案在腾讯云 如何操作新增网站备案
  11. 因为生活简单,所以内心强大
  12. 卖辣椒包的也要IPO:给肯德基们“打工”,但志不在此
  13. 网易互娱2017实习生招聘在线笔试第一场-2源代码编译
  14. Excel 如何根据单元格选中一行?
  15. 利用java计算长方形的面积
  16. 数据分析实战(一百零一):项目分析思路 —— 用户增长实践经验分享
  17. 美通企业日报 | 2020年中国薪酬预期涨幅6.5%;巴西将对中国游客免签
  18. H3C DIS命令记录
  19. html网页盒子整体放大,网页前端开发制作盒子拖拽、缩放
  20. PPTP协议详解及报文解析

热门文章

  1. csharp为何不流行_“我太南了”这些年度流行语到底是怎么选的?
  2. oracle 扩容undo,某银行积分系统数据库RAC环境扩充undo表空间
  3. idea编译器没有tomcat的选项解决方案
  4. 计算机网络cr什么意思,网络用语cr是什么意思
  5. sublime 设置自动更新_Win10关闭自动更新的三种方法
  6. 机器学习与数据挖掘_线性模型 II
  7. easyexcel 日期类型 convert_Excel个人笔记(数据类型)
  8. python如何设置画布开始位置_如何设置亚马逊站内广告?亚马逊自动广告手动广告都在什么位置?...
  9. linux中指令简约版
  10. 什么专业的会学python语言_还在纠结学什么编程语言吗?Python可能会“教”你做人...