POJ2711 Leapin' Lizards(最大流)

比较形象的是地图每个点都拆成三个点,这三个点限制流量为0或1,于是再一分为二,这样每个点都被拆成6个点。。。

其实拆两个点,连容量为柱子高的边,这样就行了。。

这题我掉坑了,“1 lizard was left behind.”。。虽然样例都把一切都说了。。要注意细节。。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<algorithm>
  5 using namespace std;
  6 #define INF (1<<30)
  7 #define MAXN 888
  8 #define MAXM 888*888*2
  9
 10 struct Edge{
 11     int v,cap,flow,next;
 12 }edge[MAXM];
 13 int vs,vt,NE,NV;
 14 int head[MAXN];
 15
 16 void addEdge(int u,int v,int cap){
 17     edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=0;
 18     edge[NE].next=head[u]; head[u]=NE++;
 19     edge[NE].v=u; edge[NE].cap=0; edge[NE].flow=0;
 20     edge[NE].next=head[v]; head[v]=NE++;
 21 }
 22
 23 int level[MAXN];
 24 int gap[MAXN];
 25 void bfs(){
 26     memset(level,-1,sizeof(level));
 27     memset(gap,0,sizeof(gap));
 28     level[vt]=0;
 29     gap[level[vt]]++;
 30     queue<int> que;
 31     que.push(vt);
 32     while(!que.empty()){
 33         int u=que.front(); que.pop();
 34         for(int i=head[u]; i!=-1; i=edge[i].next){
 35             int v=edge[i].v;
 36             if(level[v]!=-1) continue;
 37             level[v]=level[u]+1;
 38             gap[level[v]]++;
 39             que.push(v);
 40         }
 41     }
 42 }
 43
 44 int pre[MAXN];
 45 int cur[MAXN];
 46 int ISAP(){
 47     bfs();
 48     memset(pre,-1,sizeof(pre));
 49     memcpy(cur,head,sizeof(head));
 50     int u=pre[vs]=vs,flow=0,aug=INF;
 51     gap[0]=NV;
 52     while(level[vs]<NV){
 53         bool flag=false;
 54         for(int &i=cur[u]; i!=-1; i=edge[i].next){
 55             int v=edge[i].v;
 56             if(edge[i].cap!=edge[i].flow && level[u]==level[v]+1){
 57                 flag=true;
 58                 pre[v]=u;
 59                 u=v;
 60                 //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
 61                 aug=min(aug,edge[i].cap-edge[i].flow);
 62                 if(v==vt){
 63                     flow+=aug;
 64                     for(u=pre[v]; v!=vs; v=u,u=pre[u]){
 65                         edge[cur[u]].flow+=aug;
 66                         edge[cur[u]^1].flow-=aug;
 67                     }
 68                     //aug=-1;
 69                     aug=INF;
 70                 }
 71                 break;
 72             }
 73         }
 74         if(flag) continue;
 75         int minlevel=NV;
 76         for(int i=head[u]; i!=-1; i=edge[i].next){
 77             int v=edge[i].v;
 78             if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
 79                 minlevel=level[v];
 80                 cur[u]=i;
 81             }
 82         }
 83         if(--gap[level[u]]==0) break;
 84         level[u]=minlevel+1;
 85         gap[level[u]]++;
 86         u=pre[u];
 87     }
 88     return flow;
 89 }
 90 char map1[22][22],map2[22][22];
 91 int main(){
 92     int t,n,d;
 93     scanf("%d",&t);
 94     for(int cse=1; cse<=t; ++cse){
 95         scanf("%d%d",&n,&d);
 96         for(int i=0; i<n; ++i) scanf("%s",map1[i]);
 97         for(int i=0; i<n; ++i) scanf("%s",map2[i]);
 98
 99         int tot=0,m=strlen(map1[0]);
100         vs=n*m*2; vt=vs+1; NV=vt+1; NE=0;
101         memset(head,-1,sizeof(head));
102
103         for(int i=0; i<n; ++i){
104             for(int j=0; j<m; ++j){
105                 addEdge(i*m+j,i*m+j+n*m,map1[i][j]-‘0‘);
106                 for(int ni=0; ni<n; ++ni){
107                     for(int nj=0; nj<m; ++nj){
108                         if(ni==i && nj==j) continue;
109                         if((nj-j)*(nj-j)+(ni-i)*(ni-i)<=d*d) addEdge(i*m+j+n*m,ni*m+nj,INF);
110                     }
111                 }
112                 if(map2[i][j]==‘L‘) addEdge(vs,i*m+j,1),++tot;
113                 if(i+1<=d||n-i<=d || j+1<=d||m-j<=d) addEdge(i*m+j+n*m,vt,INF);
114             }
115         }
116         tot-=ISAP();
117         if(tot==0) printf("Case #%d: no lizard was left behind.\n",cse);
118         else if(tot==1) printf("Case #%d: 1 lizard was left behind.\n",cse);
119         else printf("Case #%d: %d lizards were left behind.\n",cse,tot);
120     }
121     return 0;
122 }

POJ2711 Leapin' Lizards(最大流)

时间: 10-01

POJ2711 Leapin' Lizards(最大流)的相关文章

HDU 2732 Leapin&#39; Lizards(最大流)

Leapin' Lizards Problem Description Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As you are looking around for hidden treasures, one of the rookies steps on an innocent-looking stone and the room's

K - Leapin&#39; Lizards - HDU 2732(最大流)

题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有多少蜥蜴不能离开迷宫(跳出迷宫就可以离开了.) 输入描述:输入矩阵的行M和跳跃值D,接着输入两个矩阵(列数自己求),第一个矩阵是每个柱子的耐久值,下面一个矩阵有'L'的表示这个柱子上有一只蜥蜴. 分析:题目明白还是比较容易的,矩阵的点数是20*20,也就400个点,对每个有耐久值的柱子进行拆点,然后

hdu 2732 Leapin&#39; Lizards(最大流)Mid-Central USA 2005

废话: 这道题不难,稍微构造一下图就可以套最大流的模板了.但是我还是花了好久才解决.一方面是最近确实非常没状态(托词,其实就是最近特别颓废,整天玩游戏看小说,没法静下心来学习),另一方面是不够细心,输出格式错了大意没有发现死一只和死多只之间的区别,卡在那里动不了. 题意: 在一张n*m的地图中,有一群蜥蜴,这群蜥蜴每次可以跳跃曼哈顿距离d(曼哈顿距离——dis(a, b) = |ax-bx|+|ay-by|,之后所有的距离都是曼哈顿距离),这些蜥蜴只能在地图上的一些柱子上跳跃.柱子i最多可以支持

Leapin&#39; Lizards (hdu 2732 最大流)

Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1433    Accepted Submission(s): 586 Problem Description Your platoon of wandering lizards has entered a strange room in the labyr

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

题目意思是有一些蜥蜴在一个迷宫里面,求这些蜥蜴还有多少是无论如何都逃不出来的.题目只给定一个行数n,一个最远能够跳跃的距离d.每只蜥蜴有一个初始的位置,题目保证这些位置都有一些柱子,但是它每离开一根柱子,柱子的高度就会降低1m,问最多能有多少只跳不出去. 将每个柱子在的点进行拆点,把每一个点拆完之后连一条容量为所在点柱子高度的边.从原点连一条容量为1的边,然后找到每个可以直接跳出的点,将这些点与汇点 相连容量为无穷.每个柱子与它可以到达的点的容量也为无穷. Leapin' Lizards Tim

HDU 2732 Leapin&#39; Lizards(拆点+最大流)

HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是无论如何都逃不出来的. 思路:把柱子拆点建图跑最大流即可,还是挺明显的 代码: #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <algorithm> using

HDU 2732 Leapin&#39; Lizards(拆点法+最大流)

该题是一道比较简单拆点+最大流的题目,因为每个柱子都有一定的寿命,很容易将其对应成流量,那么处理结点容量的一般方法当然是拆点法 .该题反而对边的容量没有要求,为保险起见可以设成无穷大.   该题的思路很好想,建议独立编写代码 . 推荐题目: 点击打开链接    结点法的一些见解 也可以看这里. 细节参见代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 100000000;

HDU2732:Leapin&#39; Lizards(最大流)

Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4250    Accepted Submission(s): 1705 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2732 Description: Your platoon of wandering li

hdu2732 Leapin&#39; Lizards (网络流dinic)

D - Leapin' Lizards Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Your platoon of wandering lizards has entered a strange room in the labyrinth you are exploring. As you are looking around for hidden treasur