• [SCOI2007]蜥蜴


    原题链接:https://www.luogu.org/problemnew/show/P2472

    挺裸的一道最大流,不知道为什么WA了半天,也不知改了些什么就A了。。。

    建边:

    每个有石柱的边拆成a,b两个点,流量为石柱高度。

    能跳到外面去,b点连汇点,或者跳到其他石柱上的点,b点连到达的点的a点。流量为无限大。

    对于有蜥蜴的点,源点连向这个点的a点,流量1.

    之后就是最大流板子了。

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int inf=(1<<30);
    char s[105];
    int a[55][55],b[55][55];
    int n,m,md,cnt=1,t,tot,ans;
    struct edge
    {
        int u,v,w;
    }e[200005];
    int head[1005],dis[1005];
    int tx[1005],ty[1005];
    void add(int u,int v,int w)
    {
        e[++cnt].u=head[u];head[u]=cnt;
        e[cnt].v=v;e[cnt].w=w;
        e[++cnt].u=head[v];head[v]=cnt;
        e[cnt].v=u;e[cnt].w=0;
    }
    int ds(int x,int y)
    {
        int s1=(tx[x]-tx[y])*(tx[x]-tx[y]);
        int s2=(ty[x]-ty[y])*(ty[x]-ty[y]);
        return s1+s2;
    }
    int bfs()
    {
        memset(dis,0,sizeof(dis));
        queue<int>q;
        q.push(0);dis[0]=1;
        while(!q.empty())
        {
            int tmp=q.front();q.pop();
            for(int i=head[tmp];i!=-1;i=e[i].u)
            {
                int p=e[i].v;
                if(dis[p]||e[i].w<=0) continue;
                dis[p]=dis[tmp]+1;
                q.push(p);
            }
        }
        return dis[t];
    }
    int dfs(int x,int f)
    {
        if(x==t) return f;
        int d,tmp=0;
        for(int i=head[x];i!=-1;i=e[i].u)
        {
            int nxt=e[i].v;
            if(dis[nxt]==dis[x]+1&&e[i].w>0)
            {
                d=dfs(nxt,min(f-tmp,e[i].w));
                if(d==0) continue;
                e[i].w-=d;
                e[i^1].w+=d;
                tmp+=d;
                if(tmp==f) return tmp;
            }
        }
        if(!tmp) dis[x]=0;
        return tmp;
    }
    int main()
    {
        scanf("%d %d %d",&n,&m,&md);
        memset(head,-1,sizeof(head));
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(int j=1;j<=m;j++)
            {
                a[i][j]=s[j-1]-'0';
                if(a[i][j])
                {
                    b[i][j]=++tot;
                    tx[tot]=i;ty[tot]=j;
                    dis[tot]=a[i][j];
                }
            }
        }
        t=(tot<<1)+1;
        for(int i=1;i<=tot;i++)
        {
            add(i,i+tot,dis[i]);
            if(tx[i]<=md||ty[i]<=md||tx[i]+md>n||ty[i]+md>m) add(i+tot,t,inf);
        }
        for(int i=1;i<tot;i++)
        {
            for(int j=i+1;j<=tot;j++)
            {
                if(ds(i,j)>md*md) continue;
                add(i+tot,j,inf);
                add(j+tot,i,inf);
            }
        }
        int tans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(int j=1;j<=m;j++)
            {
                if(s[j-1]!='L') continue;
                add(0,b[i][j],1);
                tans++;
            }
        }
        while(bfs()) ans+=dfs(0,inf);
        printf("%d",tans-ans);
        return 0;
    }
  • 相关阅读:
    太久了
    idea文件过大解决方法
    ibus词库导入
    Linux认证考试
    Idea Linux 下的配置 max_user_watches
    SpringBoot启动过程之web,servlet/filter等
    SpringBoot启动过程学习
    也谈一下面试
    MVCC
    Python pyside2 qt 画画面
  • 原文地址:https://www.cnblogs.com/zeroform/p/8889617.html
Copyright © 2020-2023  润新知