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

    最大独立集。
    最小割=最大流
    套路题
    我弱智的地方:边长是N严重不等于点数是N!!!数组开505也是没谁了

    #include <queue>
    #include <cstdio>
    #include <cstring>
    const int N=505,S=0,T=405,inf=0x3f3f3f3f;
    const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
    std::queue<int>q;
    int n,m,g[505][505],head[100*100+5],ecnt=1,h[100*100+5],now;
    int min(int x,int y) {return x<y?x:y;}
    struct Edge {int to,nxt,val;} e[100005<<2];
    void add(int bg,int ed,int val) {e[++ecnt].nxt=head[bg];e[ecnt].to=ed;e[ecnt].val=val;head[bg]=ecnt;}
    
    bool bfs() {
        q.push(S);
        std::memset(h,-1,sizeof h);
        h[S]=0;
        while(!q.empty()) {
            int u=q.front();
            q.pop();
            for(int v,i=head[u]; i; i=e[i].nxt) {
                v=e[i].to;
                if(h[v]==-1&&e[i].val) {
                    h[v]=h[u]+1;
                    q.push(v);
                }
            }
        }
        return h[T]!=-1;
    }
    int dfs(int x,int f) {
        if(x==T)return f;
        int used=0,tp;
        for(int i=head[x]; i; i=e[i].nxt) {
            int v=e[i].to;
            if(h[v]!=h[x]+1||!e[i].val)continue;
            tp=dfs(v,min(f-used,e[i].val));
            used+=tp,e[i].val-=tp;
            e[i^1].val+=tp;
            if(used==f)return f;
        }
        if(!used) h[x]=-1;
        return used;
    }
    int maxflow;
    void dinic() {
        while(bfs())maxflow-=dfs(S,inf);
    }
    void insert(int a,int b,int c){add(a,b,c);add(b,a,0);}
    int main() {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                scanf("%d",&g[i][j]),maxflow+=g[i][j];
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++){
                if(!((i+j)&1)) {
                    insert(S,(i-1)*m+j,g[i][j]);
                    for(int k=0;k<4;k++){
                        int nx=dx[k]+i,ny=dy[k]+j;
                        if(nx>0&&nx<=n&&ny<=m&&ny>0) {
                            insert((i-1)*m+j,(nx-1)*m+ny,inf);
                        }
                    }
                }
                else insert((i-1)*m+j,T,g[i][j]);
            }
        dinic();
        printf("%d",maxflow);
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    利用python求非线性方程
    迪士尼穷游攻略
    爬虫八之爬取京东商品信息
    爬虫七之分析Ajax请求并爬取今日头条
    爬虫五之Selenium
    爬虫4之pyquery
    前端传入 SQL 语句 到后端执行
    手写分页处理
    集合(Map,List)分组:多属性进行分组
    java 枚举类非常好的运用实例
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9265381.html
Copyright © 2011-2022 走看看