zoukankan      html  css  js  c++  java
  • P2774 方格取数问题

    思路:最小割

    提交:(2)

    错因:三目运算符写错((QwQ)

    题解:

    对棋盘黑白染色,源点向黑点连边,汇点向白点连边,权值均为这个点的权值。
    然后所有的黑点向白点连一条(Inf)的边。
    这样求出的最小割一定会割掉与源点和汇点相连的边,割掉这条边相当于不选这个点。
    所以最后答案就是所有点的权值-最小割。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<queue>
    #define R register int
    using namespace std;
    namespace Luitaryi {
    template<class I> inline I g(I& x) { x=0;
      register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
      do x=x*10+(ch-48); while(isdigit(ch=getchar())); return x*=f;
    } const int N=10010,M=50010,Inf=1e9;
    int n,m,s,t,cnt=1,sum;
    int vr[M<<1],nxt[M<<1],w[M<<1],fir[N],cur[N],d[N];
    #define P(i,j) ((i-1)*m+j)
    inline void add(int u,int v,int ww) {vr[++cnt]=v,nxt[cnt]=fir[u],w[cnt]=ww,fir[u]=cnt;}
    inline bool bfs() { memset(d,0,sizeof(d)),memcpy(cur,fir,sizeof(fir));
      queue<int> q; q.push(s),d[s]=1; 
      while(!q.empty()) { R u=q.front(); q.pop();
        for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
          if(!d[v]&&w[i]) d[v]=d[u]+1,q.push(v);
        }
      } return d[t]>0;
    }
    inline int dfs(int u,int f) {
      if(u==t||f<=0) return f; R res=f;
      for(R& i=cur[u];i;i=nxt[i]) { R v=vr[i];
        if(d[v]==d[u]+1&&w[i]) {
          R tmp=dfs(v,min(w[i],res));
          if(!tmp) d[v]=0;
          res-=tmp,w[i]-=tmp,w[i^1]+=tmp;
          if(!res) return f;
        }
      } return f-res;
    }
    inline void dinic() {while(bfs()) sum-=dfs(s,Inf);}
    inline bool ck(int i,int j) {return i<1||i>n||j<1||j>m;}
    inline void lnk(int i,int j) { R p=P(i,j);
      if(!ck(i+1,j)) add(p,P(i+1,j),Inf),add(P(i+1,j),p,0);
      if(!ck(i-1,j)) add(p,P(i-1,j),Inf),add(P(i-1,j),p,0);
      if(!ck(i,j-1)) add(p,P(i,j-1),Inf),add(P(i,j-1),p,0);
      if(!ck(i,j+1)) add(p,P(i,j+1),Inf),add(P(i,j+1),p,0);
    }
    inline void main() {
      g(n),g(m); s=n*m+1,t=n*m+2;
      for(R i=1;i<=n;++i) for(R j=1,x,p;j<=m;++j) {
        sum+=g(x),p=P(i,j); 
        ((i+j)&1)?(add(s,p,x),add(p,s,0),lnk(i,j)):(add(p,t,x),add(t,p,0));
      }
      dinic(); printf("%d
    ",sum);
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2019.08.19
    81

  • 相关阅读:
    Javascript的私有变量和方法、共有变量和方法以及特权方法、构造器、静态共有属性和静态共有方法
    Spring4整合Hibernate4出现的错误的解决
    Javascript类的创建
    Kettle学习总结(一)
    Kettle Excel导入数据到数据库
    Python 爬虫 2 (转)
    Js仿腾讯微博效果
    飘雪效果
    列表获取对应图片
    飞入购物车
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11376582.html
Copyright © 2011-2022 走看看