zoukankan      html  css  js  c++  java
  • luogu P2472 [SCOI2007]蜥蜴 网络流 拆点

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #define N 2000005
    #define p(a,b) (a-1)*m+b
    #define q(a,b) p(a,b)+n*m
    using namespace std;
    const int inf=(1 << 26);
    int n,m,S,T,d;
    int idx,head[N],cur[N],q[N];
    int e[N],ne[N],w[N];
    int ans;
    char mp[110][220];
    int g[220][220];
    int sum,ap[220][220];
    inline void add(int u,int v,int f)
    {
        e[idx]=v;
        w[idx]=f;
        ne[idx]=head[u];
        head[u]=idx++;
    }
    inline bool bfs()
    {
        int f=0,t=0;
        memset(cur,-1,sizeof(cur));
        q[t++]=0;
        cur[S]=0;
        while(f<t)
        {
            int now=q[f++];
            for(int i=head[now]; ~i; i=ne[i])
            {
                int v=e[i];
                if(cur[v]==-1&&w[i])
                {
                    cur[v]=cur[now]+1;
                    q[t++]=v;
                }
            }
        }
        if(cur[T]!=-1)
            return 1;
        return 0;
    }
    inline int dfs(int x,int f)
    {
        if(x==T)
            return f;
        int w1,used=0;
        for(int i=head[x]; ~i; i=ne[i])
        {
            int v=e[i];
            if(cur[v]==cur[x]+1&&w[i])
            {
                w1=dfs(v,min(f-used,w[i]));
                w[i]-=w1;
                w[i^1]+=w1;
                used+=w1;
                if(used==f)
                    return f;
            }
        }
        if(!used)
            cur[x]=-1;
        return used;
    }
    void dinic()
    {
        while(bfs())
            ans+=dfs(0,0x3f3f3f3f);
    }
    bool dis(int a,int b,int x,int y)
    {
        return (a-x)*(a-x)+(b-y)*(b-y)<=d*d;
    }
    bool check(int x,int y)
    {
        if(n-x<d||m-y<d||x<=d||y<=d)
            return true;
        return false;
    }
    int main()
    {
        memset(head,-1,sizeof head);
        cin>>n>>m>>d;
        S=0,T=n*m*2+1;
        for(int i=1; i<=n; i++)
            cin>>mp[i]+1;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                ap[i][j]=mp[i][j]-'0';
        for(int i=1; i<=n; i++)
            cin>>mp[i]+1;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            {
                if(mp[i][j]=='L')
                {
                    add(S,p(i,j),1);
                    add(p(i,j),S,0);
                    sum++;
                }
                if(check(i,j))
                {
                    add(q(i,j),T,inf);
                    add(T,q(i,j),0);
                }
                if(ap[i][j])
                {
                    add(p(i,j),q(i,j),ap[i][j]);
                    add(q(i,j),p(i,j),0);
                }
                for(int x=1; x<=n; x++)
                    for(int y=1; y<=m; y++)
                    {
                        if(x==i&&y==j)continue;
                        if(dis(i,j,x,y))
                            add(q(i,j),p(x,y),inf),add(p(x,y),q(i,j),0);
                    }
            }
        dinic();
        cout<<sum-ans<<endl;
        return 0;
    }
  • 相关阅读:
    使用Visual C++进行串口通信编程
    预处理器进行调试
    怎样用C#实现完整文档打印功能
    如何能练就成一个卓越的程序员
    C# 实现Epson热敏打印机打印 Pos机用
    HARD HARD STUDY
    同步文本框内容的JS代码
    导出Excel之判断电脑中office的版本
    js设置IE检查所存网页的较新版本之‘每次访问此页时检查’
    批量更新sql表某字段范围内的随机数
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/13177786.html
Copyright © 2011-2022 走看看