1066: [SCOI2007]蜥蜴

Time Limit: 1 Sec   Memory Limit: 162 MB
Submit: 2947   Solved: 1471
[ Submit][ Status][ Discuss]

Description

  在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃
到边界外。 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石
柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不
变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个
石柱上。

Input

  输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱
,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

Output

  输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

Sample Input

5 8 2
00000000
02000000
00321100
02000000
00000000
........
........
..LLLL..
........
........

Sample Output

1

HINT

100%的数据满足:1<=r, c<=20, 1<=d<=4

从隔壁Orion_Rigel博客搬了张思路图过来(我是盗图王)

感觉代码规模差不多,为何为TLE呢?
先放TLE的代码,以后AC了再更新
————UPD2017.5
一拖就拖了一年的节奏?
其实只要换成邻接表就可以了
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 const int INF=0x3f3f3f3f;
  8 const int mxn=1205;
  9 struct edge{
 10     int v,nxt,f;
 11 }e[mxn*mxn];
 12 int hd[mxn],mct=1;
 13 void add_edge(int u,int v,int f){
 14     e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=f;hd[u]=mct;return;
 15 }
 16 void insert(int u,int v,int f){
 17     if(!v)return;
 18 //    printf("%d to %d : %d\n",u,v,f);
 19     add_edge(u,v,f); add_edge(v,u,0);
 20     return;
 21 }
 22 int n,m,D,S,T;
 23 int d[mxn];
 24 bool BFS(){
 25     queue<int>q;
 26     memset(d,0,sizeof d);
 27     d[S]=1;q.push(S);
 28     while(!q.empty()){
 29         int u=q.front();q.pop();
 30         for(int i=hd[u];i;i=e[i].nxt){
 31             int v=e[i].v;
 32             if(!d[v] && e[i].f){
 33 //                printf("%d to %d :%d\n",u,v,e[i].f);
 34                 d[v]=d[u]+1;
 35                 q.push(v);
 36             }
 37         }
 38     }
 39     return d[T];
 40 }
 41 int DFS(int u,int lim){
 42     if(u==T)return lim;
 43     int f=0,tmp;
 44     for(int i=hd[u],v;i;i=e[i].nxt){
 45         v=e[i].v;
 46         if(e[i].f && d[v]==d[u]+1 && (tmp=DFS(e[i].v,min(lim,e[i].f)))){
 47             e[i].f -=tmp;
 48             e[i^1].f+=tmp;
 49             f+=tmp;
 50             lim -=tmp;
 51             if(!lim)return f;
 52         }
 53     }
 54     d[u]=0;
 55     return f;
 56 }
 57 int Dinic(){
 58     int res=0;
 59     while(BFS())res+=DFS(S,INF);//,printf("res:%d\n",res);
 60     return res;
 61 }
 62 int id[25][25],sz=0,lct=0;
 63 int mp[25][25];
 64 void ADD(int x,int y,int out){
 65     bool flag=0;
 66     for(int i=x-D;i<=x+D;i++){
 67         for(int j=y-D;j<=y+D;j++){
 68             if(i==x && j==y)continue;
 69             if( (i-x)*(i-x)+(j-y)*(j-y)<=D*D ){
 70                 if(i<1 || i>n || j<1 || j>m){if(!flag)insert(out,T,INF),flag=1;}
 71                 else insert(out,id[i][j],INF);
 72             }
 73         }
 74     }
 75     return;
 76 }
 77 void Build(){
 78     T=sz+sz+lct+1;
 79     for(int i=1;i<=n;i++)
 80         for(int j=1;j<=m;j++){
 81             int out=id[i][j]+lct+sz;
 82             if(mp[i][j]){
 83 //                printf("[%d %d ]%d\n",i,j,mp[i][j]);
 84                 insert(id[i][j],out,mp[i][j]);
 85                 ADD(i,j,out);
 86             }
 87         }
 88     return;
 89 }
 90 char sc[25];
 91 int main(){
 92 //    freopen("in.txt","r",stdin);
 93     int i,j;
 94     scanf("%d%d%d",&n,&m,&D);
 95     for(i=1;i<=n;i++){
 96         scanf("%s",sc+1);
 97         for(j=1;j<=m;j++){
 98             mp[i][j]=sc[j]-'0';
 99             if(mp[i][j])id[i][j]=++sz;
100         }
101     }
102     S=0;
103     for(i=1;i<=n;i++){
104         scanf("%s",sc+1);
105         for(j=1;j<=m;j++){
106             if(sc[j]=='L'){
107                 ++lct;
108                 insert(S,lct+sz,1);
109                 insert(lct+sz,id[i][j],1);
110             }
111         }
112     }
113     Build();
114     int ans=Dinic();
115 //    printf("%d\n",ans);
116 /*    for(i=hd[2];i;i=e[i].nxt){
117         int v=e[i].v;
118         printf("%d %d : %d\n",2,v,e[i].f);
119     }*/
120     printf("%d\n",lct-ans);
121     return 0;
122 }

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cmath>
  5 #include<cstring>
  6 using namespace std;
  7 const int INF=0x6ffffff;
  8 struct NODE{
  9     int w;//容量(在此题中为石柱高度)
 10     int f;//流量
 11 }e[1000][1000];//邻接矩阵流量边
 12 int r,c;
 13 int s,t;
 14 int dis;//跳跃距离
 15 int mp[60][60],//坐标为[x][y]的点是否为结点,是的话记录节点号
 16     ht[60][60];//高度
 17 int cnode=0,clizard=0;//结点数 蜥蜴数
 18 //
 19 int add_eg(int u,int v,int h){
 20     e[u][v].w=h;
 21 }
 22 int pd(int x1,int y1,int x2,int y2){
 23     return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=dis*dis;
 24 }
 25 //
 26 int q[6000],d[60];
 27 bool flag[60];
 28 int BFS(){
 29     int hd=1,tl=1;
 30     int u,v;
 31     memset(flag,0,sizeof(flag));
 32     q[hd]=s;d[s]=0;flag[s]=1;
 33     while(hd<=tl){
 34         u=q[hd];
 35         for(v=0;v<=t;v++){
 36             if(!flag[v] && e[u][v].w>e[u][v].f){
 37                 flag[v]=1;
 38                 d[v]=d[u]+1;
 39                 q[++tl]=v;
 40             }
 41             if(flag[t])return 1;
 42         }
 43         hd++;
 44     }
 45     return 0;
 46
 47 }
 48 int DFS(int v,int low){
 49     int i;    int flow;
 50     if(v==t)return low;
 51     for(i=0;i<=t;i++){
 52         if(e[v][i].w>e[v][i].f && d[i]==d[v]+1){
 53             if(flow=DFS(i,min(low,e[v][i].w-e[v][i].f))){
 54                 e[v][i].f+=flow;
 55                 e[i][v].f=-e[v][i].f;
 56                 return flow;
 57             }
 58         }
 59     }
 60     return 0;
 61 }
 62 int dinic(){
 63     int ans=0;
 64     while(BFS()){
 65         int flow;
 66         while(flow=DFS(s,INF)){
 67             ans+=flow;
 68         }
 69     }
 70     return ans;
 71 }
 72 int main(){
 73     scanf("%d%d%d",&r,&c,&dis);
 74     int i,j;
 75     char ch[30];
 76     for(i=1;i<=r;i++){//读石柱图
 77         scanf("%s",ch);
 78         for(j=0;j<c;j++){
 79             ht[i][j+1]=ch[j]-'0';
 80             if(ht[i][j+1]>0)mp[i][j+1]=++cnode;
 81         }
 82     }
 83     s=0;t=cnode*2+1;
 84     for(i=1;i<=r;i++){//读蜥蜴图
 85         scanf("%s",ch);
 86         for(j=0;j<c;j++){
 87             if(ch[j]=='L'){
 88                 add_eg(s,mp[i][j+1],1);
 89                 clizard++;
 90             }
 91         }
 92     }
 93     for(i=1;i<=r;i++){
 94         for(j=1;j<=c;j++){
 95
 96             if(mp[i][j]){
 97
 98                 //建石柱自身到自身镜像的容量为石柱高度的边
 99                 add_eg(mp[i][j],mp[i][j]+cnode,ht[i][j]);
100
101             if(i<=dis || i+dis>r || j<=dis || j+dis>c)
102                 add_eg(mp[i][j]+cnode,t,INF);//建出区域的边
103             int a,b;
104             for(a=max(i-dis,1);a<=min(i+dis,r);a++)
105               for(b=max(j-dis,1);b<=min(j+dis,c);b++){
106                   if(i!=a || b!=j)
107                   if(pd(i,j,a,b)) add_eg(mp[i][j]+cnode,mp[a][b],INF);//建石柱之间的边
108               }
109             }
110         }
111     }
112     int ans=dinic();
113 //    printf("%d %d",clizard,ans);
114     printf("%d\n",clizard-ans);
115     return 0;
116 }

TLE

转载于:https://www.cnblogs.com/SilverNebula/p/5550579.html

BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴相关推荐

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

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

  2. BZOJ1066: [SCOI2007]蜥蜴

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

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

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

  4. BZOJ 1066[SCOI2007]蜥蜴

    学了ISAP说我来做一道网络流的傻逼题吧然后自己变成了一个傻逼.. De了很久的bug然后发现我从源点向每只蜥蜴连了INF的边,喵喵喵? 最近写博客好像比较敷衍,还是说一下.每个柱子拆点,源点向每个有 ...

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

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

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

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

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

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

  8. BZOJ 2287 POJ Challenge 消失之物

    BZOJ题目不完整,看了看题解.发现他们都要取模10,还以为是dp的限制. 改了两小时,之后猛然发现.卧槽原本我少了一个取模. 写法1:暴力写法 最简单的想法(只要你会背包dp) 我在枚举每次不选哪个 ...

  9. LuoguP2472 SCOI2007 蜥蜴

    蒟蒻第二篇博客,恶补网络流之后决定整个活 题目链接 目录 一.模型建立 二.注意事项 三.AC代码 总结 一.模型建立 网络流 这道题的难点在于它的限制是在点上而不是在边上,那我们考虑如何把点的限制转 ...

最新文章

  1. 223.主成分分析PCA
  2. sqlplus column命令用法
  3. react native的页面整体下拉刷新
  4. 001_支持并发的两次判空懒汉单例
  5. TF实现多minibatch梯度累加及反向更新
  6. s8050三极管经典电路_浅谈电路的PSRR(电源纹波抑制比)
  7. 为什么我们选择 Flutter 开发移动应用?
  8. matlab语法——数据类型、科学计数法和注释
  9. als算法参数_矩阵分解之交替最小二乘ALS
  10. CentOS和WIN7双系统时间错误
  11. 数据库共享锁与排它锁
  12. 戴尔笔记本怎么安装统信uos系统?戴尔笔记本安装统信uos+win双系统
  13. 红牛v5 android cm12.1 分辨率修改
  14. 思维导图软件测评Draw、Gitmind、Xmind、Effie、Miro、Excalidraw
  15. 【图像融合】基于matlab高分辨率全色图IHS图像融合(含评价指标)【含Matlab源码 2406期】
  16. 【Python入门教程】第57篇 循环进阶之模拟do…while语句
  17. 0x00004005错误代码是什么意思?0x00004005错误代码解决办法
  18. 2014秋江苏计算机二级,关于2014年秋季江苏省计算机等级考试报名通知
  19. 预装win8的华硕A450V UEFI安装ubuntu成功经验分享
  20. 他精通计算机英语怎么说,掌握精通用英语怎么说

热门文章

  1. Hwclock用法介绍
  2. 茅台酒如何转卖?价格如何才最合理?爬取公众号后每天自动发送价格到钉钉如何呢?
  3. Map接口总结与HashMap源码分析
  4. Python按特定字符分列
  5. 【直播升级——AWS 云之旅】
  6. 3.2 Hadoop简介
  7. python基因差异分析_Biopython基因组分析
  8. 《科比传》留下深刻印象的文字
  9. 科比最新超酷广告《门徒》
  10. 实训十四:路由器策略路由(PBR)配置