BZOJ1066_蜥蜴_KEY
经过长时间的旅行,很长时间没写过博客了,这次把上次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 ;
- }
BZOJ1066_蜥蜴_KEY的更多相关文章
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- bzoj 1066 蜥蜴
最大流. 建图:首先将每根柱子拆成两个点. 每根柱子的入点向出点连一条容量为柱子高度的边. 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边. 源点向每根初始有蜥蜴的柱子的入点连一条容量为一 ...
- BZOJ 1066 【SCOI2007】 蜥蜴
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为$1$,蜥蜴的跳跃距离是d,即蜥蜴可以跳 ...
- 蜥蜴(bzoj 1066)
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...
- BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: ...
- 【bzoj1066】[SCOI2007]蜥蜴 网络最大流
[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的 ...
- 【BZOJ】1066: [SCOI2007]蜥蜴(最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1066 本题想一想应该懂了的. 我们想啊,,每个点都有限制,每个点都可以跳到另一个有限制的点,每个有蜥 ...
- BZOJ1066 [SCOI2007]蜥蜴
首先...这是道(很水的)网络流 我们发现"每个时刻不能有两个蜥蜴在同一个柱子上"这个条件是没有用的因为可以让外面的先跳,再让里面的往外跳 但是还有柱子高度的限制,于是把柱子拆点为 ...
随机推荐
- Python 冒泡排序法分析
冒泡排序法 def maopao(): array = [2,1,3,6,5,4] #确定一组需要排序的数值列表 for i in range(len(array)-1): #大循环次数=列表长度,但 ...
- ZOJ-3286 Very Simple Counting---因子数打表
题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...
- UVa 1608 - Non-boring sequences
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- C/C++心得-结构体
先说句题外话,个人认为,基本上所有的高级语言被设计出来的最终目的是降低软件开发难度,提升软件开发人员素质和团队协作能力,降低软件维护的难度.在学习语言的时候,可以从这么方面来推测各种语言语法设计的原因 ...
- Yii2.0 请求
1.获取请求参数 $request = Yii::$app->request; $get = $request->get(); // 等价于:$get = $_GET; $id = $re ...
- PHP中将字符串转化为整数(int) intval() printf()
int <?php $foo = "1"; // $foo 是字符串类型 $bar = (int)$foo; // $bar 是整型 ?> intval <?ph ...
- 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
“/”应用程序中的服务器错误. 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“c552ea94-6fbb-11d5-a9c1-00104bb6fc1c”. 说明: 执行当前 Web ...
- PAT——1006. 换个格式输出整数
1006. 换个格式输出整数 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们用字母B来表示“百” ...
- window7及以上 创建软链接 mklink
软链接是一种文件共享方式. 命令:mklink /d "C:\d" "C:\e" 有哪些坑: 1.此命名必须以管理员方式在cmd运行 2.文件必须不存在..通过 ...
- Unity 游戏框架搭建 (二十二) 简易引用计数器
引用计数是一个很好用的技术概念,不要被这个名字吓到了.首先来讲讲引用计数是干嘛的. 引用计数使用场景 有一间黑色的屋子,里边有一盏灯.当第一个人进屋的时候灯会打开,之后的人进来则不用再次打开了,因为已 ...