#网络流,最大流,dinic#洛谷 2472 蜥蜴

题目

一些蜥蜴站在石柱上,相邻石柱的距离为1,蜥蜴可以跳到平面距离不超过d的石柱上。每次当蜥蜴跳跃时,所离开的石柱高度减1,如果该石柱原来高度为1,则蜥蜴离开后石柱消失。任何时刻不能有两只蜥蜴在同一个石柱上,求最少有多少只蜥蜴无法逃离。


分析

最少有多少只蜥蜴无法逃离,也就是蜥蜴总数-最多有多少只蜥蜴可以逃离,跑最大流,关键是构图
把石柱拆点变成入点和出点,流量是石柱的高度,用源点连接蜥蜴,流量是1,可以跳出边界的石柱的出点连接汇点,流量无限大,能跳到达的石柱用出点连接入点。如图所示:
这里写图片描述


代码

#include <cstdio>
#include <cstring>
#include <queue>
#define qx(i,j) (~-i)*m+j
#define o(a) a*a
using namespace std;
struct node{int y,w,next;}e[1000001]; queue<int>q;
int ls[2501],x[2501],y[2501],dis[2501],k=1,n,m,l,te,s,t,ans;
void add(int x,int y,int w){
    e[++k]=(node){y,w,ls[x]}; ls[x]=k;
    e[++k]=(node){x,0,ls[y]}; ls[y]=k;
}
bool bfs(int s){
    for (int i=1;i<=t;i++) dis[i]=0;
    queue<int>q; q.push(s); dis[s]=1;
    while (q.size()){
        int x=q.front(); q.pop();
        for (int i=ls[x];i;i=e[i].next)
        if (e[i].w>0&&!dis[e[i].y]){
            dis[e[i].y]=dis[x]+1;
            if (e[i].y==t) return 1;
            q.push(e[i].y);
        }
    }
    return 0;
}
int dinic(int x,int now){
    if (x==t||!now) return now;
    int rest=0,f;
    for (int i=ls[x];i;i=e[i].next)
    if (e[i].w>0&&dis[e[i].y]==dis[x]+1){
        rest+=(f=dinic(e[i].y,min(now-rest,e[i].w)));
        e[i].w-=f; e[i^1].w+=f;
        if (now==rest) return rest;
    }
    if (!rest) dis[x]=0;
    return rest;
}
int main(){
    char g[51];
    scanf("%d%d%d\n",&n,&m,&l); s=(n*m)<<1|1; t=s+1;
    for (int i=1;i<=n;i++){
        scanf("%s",g);
        for (int j=1;j<=m;j++)
        if (g[j-1]!='0'){
            x[++te]=i; y[te]=j;
            add(qx(i,j),qx(i+n,j),g[j-1]-48);//拆点
            if (i<=l||j<=l||i+l>n||j+l>m) add(qx(i+n,j),t,1e5);//连接汇点
        }
    }
    for (int i=1;i<=n;i++){
        scanf("%s",g);
        for (int j=1;j<=m;j++)
        if (g[j-1]=='L') ans++,add(s,qx(i,j),1);//连接蜥蜴
    }
    for (int i=1;i<=te;i++)
    for (int j=1;j<=te;j++)
    if (i!=j&&l*l>=((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])))
    add(qx(x[i]+n,y[i]),qx(x[j],y[j]),1e5);//可以跳跃
    while (bfs(s)) ans-=dinic(s,1e5);//最大流
    return !printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80961849