蜥蜴

bzoj 1066 蜥蜴

爱⌒轻易说出口 提交于 2020-01-17 03:48:19
最大流。 建图:首先将每根柱子拆成两个点。 每根柱子的入点向出点连一条容量为柱子高度的边。 每根柱子的出点向可以到达的柱子的入点连一条容量为正无穷的边。 源点向每根初始有蜥蜴的柱子的入点连一条容量为一的边。 每根可以跳出地图的柱子的出点向汇点连一条容量为正无穷的边。 跑一遍最大流就是最多能逃出的蜥蜴数。 1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int dian=8005; 9 const int bian=160005; 10 const int INF=0x3f3f3f3f; 11 int h[dian],nxt[bian],ver[bian],val[bian],ch[dian]; 12 char mapp[25][25],map[25][25]; 13 char lala[25]; 14 int n,m,d,tot,ans; 15 int S,T; 16 void add(int aa,int bb,int cc){ 17 tot++;ver[tot]=bb;nxt[tot]=h[aa];val[tot]=cc;h[aa]

[洛谷P2472] [SCOI2007]蜥蜴

匿名 (未验证) 提交于 2019-12-02 23:49:02
蜥蜴 一道网络流,先来分析一下问题: 在一个 \(r*c\) 的图中分布了一些数,其他地方都用 \(0\) 填充,我们分别从指定的一些数出发,每次可以移动到周围距离为 \(d\) 以内的数上(或图外),原来的数会被 \(-1\) ,任何时候数不能为负。各个数走法之间互相影响。问至多有多少个数出发能到达图外? 把这个题的限制条件列出来一下吧: 每个石柱只能站一只蜥蜴 每个石柱最多被经过其高度次 石柱与石柱之间,石柱与图边界之间要距离小于等于 \(d\) 才能到达 首先我的角度是以每个石柱本身的限制条件入手。我们知道一个高度为 \(h\) 的石柱最多可以被经过 \(h\) 次(显然,蜥蜴是不走回头路的,因为这是对资源的浪费),而网络流的基本性质之一,是每条边最多将其上限流满(相当于有一个上限),那么可以考虑将石柱的高度作为网络流建图边上的限制。但是每个石柱是一个点,怎么办呢,我们就考虑把每个石柱拆点,把编号为 \(i\) 的点拆成 \(i\) 和 \(i + r * c\) ,然后把流入这个点的边全部接到 \(i\) 上,流出这个点的边全部接到 \(i+r*c\) 上,把限制加在两点之间的连边上(流量为 \(h\) )。这是对于石柱的处理,也是我认为这个问题中最关键的一步。 剩下的就比较好办了。 对于“每个石柱只能站一只蜥蜴”的限制条件,将“只能站一只”作为上界