zoukankan      html  css  js  c++  java
  • BZOJ 1066 蜥蜴

    传送门

    题解:这题就是HDU2732的中文题面。。。蜥蜴跳的距离是曼哈顿距离。建一个源点对每一个L所在的地方建一个容量为1的边,对柱子如果能跳出去就与汇点建一个容量为柱子容量的边,柱子的出点与入点建一个容量INF的边,柱子与柱子之间只要满足条件就将一个柱子的出点,与另一个柱子的入点建一条为柱子容量的边

     
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <vector>
    #include <cstring>
    #include <iomanip>
    #include <set>
    #include<ctime>
    //CLOCKS_PER_SEC
    #define se second
    #define fi first
    #define ll long long
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define Pii pair<int,int>
    #define Pli pair<ll,int>
    #define ull unsigned long long
    #define pb push_back
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    const double Pi=3.14159265;
    const int N=1e5+50;
    const ull base=163;
    const int INF=0x3f3f3f3f;
    using namespace std;
    int head[N],nx[N],to[N],cap[N],cur[N];
    int s,t;
    int tot=0;
    void add(int u,int v,int c){
        nx[tot]=head[u];
        to[tot]=v;
        cap[tot]=c;
        head[u]=tot++;
         
        nx[tot]=head[v];
        to[tot]=u;
        cap[tot]=0;
        head[v]=tot++;
    }
    int d[N];
    int bfs(){
        memset(d,-1,sizeof(d));
        queue<int>q;
        q.push(s);
        d[s]=1;
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int i=head[u];~i;i=nx[i]){
                int v=to[i];
                if(d[v]==-1&&cap[i]>0){
                    d[v]=d[u]+1;
                    q.push(v);
                }
            }
        }
        return d[t]!=-1;
    }
    int dfs(int s,int a){
        if(s==t||a==0)return a;
        int flow=0,f;
        for(int &i=cur[s];~i;i=nx[i]){
            int v=to[i];
            if(d[v]==d[s]+1&&cap[i]>0&&(f=dfs(v,min(a,cap[i])))){
                flow+=f;
                cap[i]-=f;
                cap[i^1]+=f;
                a-=f;
                if(a==0)break;
            }
        }
        return flow;
    }
    int dinic(){
        int ans=0;
        while (bfs()) {
            for(int i=0;i<=t;i++)cur[i]=head[i];
            while(int di=dfs(s,INF))ans+=di;
        }
        return ans;
    }
    char mat[100][100];
    char str[100][100];
    int cal(int x,int y,int a,int b){
        return abs(x-a)+abs(y-b);
    }
    vector<Pii>vec;
    int main(){// s--0  出n*m+m*i+j+30  入m*i+j
        s=0,t=2000;
        int n,m,f;
        scanf("%d%d%d",&n,&m,&f);
        memset(head,-1,sizeof(head));
        for(int i=1;i<=n;i++){
            scanf("%s",mat[i]+1);
            for(int j=1;j<=m;j++){
                if(mat[i][j]!='0'){
                    vec.pb({i,j});
                    add(m*i+j,n*m+m*i+j+30,mat[i][j]-'0');
                    if(i<=f||j<=f||(n-i)<f||(m-j)<f){
                        add(n*m+30+m*i+j,t,mat[i][j]-'0');//可以跳出去
                    }
                }
            }
        }
        for(int i=0;i<vec.size();i++){
            Pii u=vec[i];
            for(int j=i+1;j<vec.size();j++){
                Pii v=vec[j];
                if(cal(u.fi,u.se,v.fi,v.se)<=f){
                    //cout<<"fds";
                    add(n*m+m*u.fi+u.se+30,m*v.fi+v.se,INF);
                    add(n*m+m*v.fi+v.se+30,m*u.fi+u.se,INF);
                }
            }
        }
        int ss=0;
        for(int i=1;i<=n;i++){
            scanf("%s",str[i]+1);
            for(int j=1;j<=m;j++){
                if(str[i][j]=='L'){
                    ss++;
                    add(0,m*i+j,1);
                }
            }
        }
        int d=dinic();
         
        int ans=ss-d;
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    单例模式
    抽象工厂模式
    工厂方法模式
    并发编程:等待/通知机制
    并发编程:深入理解synchronized
    并发编程:为何线程的等待方法都会抛出InterruptException
    并发编程:基础知识
    Mybatis:整合Spring
    Mybatis:插件原理
    Mybatis:体系结构和工作原理
  • 原文地址:https://www.cnblogs.com/Mrleon/p/9097850.html
Copyright © 2011-2022 走看看