zoukankan      html  css  js  c++  java
  • [HNOI2013]切糕

    最小割


    让相邻的最小割上的点层数差小于等于d,也就是大于d时S,T仍然能相通
    那么可以从下面d层向上面相邻的点连容量为INF的边
    表示相邻的最小割上的点层数差大于d时,还能走这条INF边回来,流其它的路到T,这样就强制要小于等于d了


    # include <bits/stdc++.h>
    # define IL inline
    # define RG register
    # define Fill(a, b) memset(a, b, sizeof(a))
    # define Copy(a, b) memcpy(a, b, sizeof(a))
    # define ID(a, b) n * (a - 1) + b
    using namespace std;
    typedef long long ll;
    const int _(2e5 + 10), __(2e6 + 10), INF(2147483647);
    
    IL ll Read(){
        RG char c = getchar(); RG ll x = 0, z = 1;
        for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
        for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
        return x * z;
    }
    
    int p, q, r, v[60][60][60], d, id[60][60][60], num;
    int w[__], fst[_], nxt[__], to[__], cnt, S, T, lev[_], cur[_], max_flow;
    queue <int> Q;
    
    IL void Add(RG int u, RG int v, RG int f){
        w[cnt] = f; to[cnt] = v; nxt[cnt] = fst[u]; fst[u] = cnt++;
        w[cnt] = 0; to[cnt] = u; nxt[cnt] = fst[v]; fst[v] = cnt++;
    }
    
    IL int Dfs(RG int u, RG int maxf){
        if(u == T) return maxf;
        RG int ret = 0;
        for(RG int &e = cur[u]; e != -1; e = nxt[e]){
            if(lev[to[e]] != lev[u] + 1 || !w[e]) continue;
            RG int f = Dfs(to[e], min(w[e], maxf - ret));
            ret += f; w[e ^ 1] += f; w[e] -= f;
            if(ret == maxf) break;
        }
        if(!ret) lev[u] = 0;
        return ret;
    }
    
    IL bool Bfs(){
        Fill(lev, 0); lev[S] = 1; Q.push(S);
        while(!Q.empty()){
            RG int u = Q.front(); Q.pop();
            for(RG int e = fst[u]; e != -1; e = nxt[e]){
                if(lev[to[e]] || !w[e]) continue;
                lev[to[e]] = lev[u] + 1;
                Q.push(to[e]);
            }
        }
        return lev[T];
    }
    
    int main(RG int argc, RG char* argv[]){
        Fill(fst, -1); p = Read(); q = Read(); r = Read(); d = Read();
        for(RG int i = 1; i <= r; ++i)
            for(RG int j = 1; j <= p; ++j)
                for(RG int k = 1; k <= q; ++k)
                    id[i][j][k] = ++num, v[i][j][k] = Read();
        for(RG int j = 1; j <= p; ++j)
            for(RG int k = 1; k <= q; ++k)
                id[r + 1][j][k] = ++num;
        T = num + 1;
        for(RG int j = 1; j <= p; ++j)
            for(RG int k = 1; k <= q; ++k)
                Add(S, id[1][j][k], INF), Add(id[r + 1][j][k], T, INF);
        for(RG int i = 1; i <= r; ++i)
            for(RG int j = 1; j <= p; ++j)
                for(RG int k = 1; k <= q; ++k){
                    Add(id[i][j][k], id[i + 1][j][k], v[i][j][k]);
                    if(i - d){
                        if(j) Add(id[i][j][k], id[i - d][j - 1][k], INF);
                        if(k) Add(id[i][j][k], id[i - d][j][k - 1], INF);
                        if(j < p) Add(id[i][j][k], id[i - d][j + 1][k], INF);
                        if(k < q) Add(id[i][j][k], id[i - d][j][k + 1], INF);
                    }
                }
        while(Bfs()) Copy(cur, fst), max_flow += Dfs(S, INF);
        printf("%d
    ", max_flow);
        return 0;
    }
    
  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/8206348.html
Copyright © 2011-2022 走看看