[P1361] 小M的作物 - 最小割

没想到今天早上的第一题网络流就血了这么多发

从经典的二选一问题上魔改 仍然考虑最小割

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 163840, MAXN = 2602144;
#define reset(x) memset(x,0,sizeof x)
namespace solver {
struct graph {
    int n,m,M,S,T,head[N],cur[N],dep[N],gap[N],q[N];
    long long ans;
    struct ed {
        int to,nxt,val;
    } edge[MAXN];
    void init(int n0,int m0,int S0,int T0) {
        n=n0,m=m0,S=S0,T=T0,M=1,reset(gap);
        reset(head),reset(cur),reset(dep),reset(q);
    }
    void make(int u,int v,int w) {
        edge[++M]=(ed) {v,head[u],w},head[u]=M;
    }
    int dfs(int u,int mx) {
        if (u==T)
            return mx;
        int num=0,f;
        for (int &i=cur[u],v; i; i=edge[i].nxt)
            if (dep[v=edge[i].to]==dep[u]-1 && (f=edge[i].val))
                if (edge[i].val-=(f=dfs(v,min(mx-num,f))), edge[i^1].val+=f, (num+=f)==mx)
                    return num;
        if (!--gap[dep[u]++])
            dep[S]=n+1;
        return ++gap[dep[u]],cur[u]=head[u],num;
    }
    void solve() {
        for (int i=1; i<=n; ++i)
            cur[i]=head[i];
        ans=0;
        for (gap[0]=n; dep[S]<=n; ans+=dfs(S,0x7fffffff));
    }
} g;

int n,m,S,T,t1,t2,t3;

void init() {
    g.init(n,m,S,T);
}

int solve() {
    g.solve();
    return g.ans;
}

void make(int t1,int t2,int t3) {
    g.make(t1,t2,t3);
    g.make(t2,t1,0);
}
} // namespace solver

int n,a[10005],b[10005],m,c[10005][2];

signed main() {
    int ans = 0;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i], ans+=a[i];
    for(int i=1;i<=n;i++) cin>>b[i], ans+=b[i];
    cin>>m;
    solver::n = n+m*2+2;
    solver::S = n+m*2+1;
    solver::T = n+m*2+2;
    solver::init();
    for(int i=1;i<=n;i++) solver::make(n+m*2+1, i, a[i]);
    for(int i=1;i<=n;i++) solver::make(i, n+m*2+2, b[i]);
    for(int i=1;i<=m;i++) {
        int k;
        cin>>k>>c[i][0]>>c[i][1];
        ans += c[i][0] + c[i][1];
        solver::make(n+m*2+1, n+i*2-1, c[i][0]);
        solver::make(n+i*2, n+m*2+2, c[i][1]);
        while(k--) {
            int tmp;
            cin>>tmp;
            solver::make(n+i*2-1,tmp,2e9+10);
            solver::make(tmp,n+i*2,2e9+10);
        }
    }
    cout<<ans - solver::solve()<<endl;
}

原文地址:https://www.cnblogs.com/mollnn/p/12258454.html

时间: 2024-10-05 12:13:15

[P1361] 小M的作物 - 最小割的相关文章

BZOJ 3438: 小M的作物( 最小割 )

orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ------------------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep(i, n) for(in

3438: 小M的作物[最小割]

3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1073  Solved: 465[Submit][Status][Discuss] Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai的收益,在B中种植 可以获得bi的收益,而且,现在还有这么一种神奇的现

【BZOJ-3438】小M的作物 最小割 + 最大权闭合图

3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 825  Solved: 368[Submit][Status][Discuss] Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai的收益,在B中种植可以获得bi的收益,而且,现在还有这么一种神奇的现象,就

HDU 6214 Smallest Minimum Cut 最小割,权值编码

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这样得到最大流 maxflow / (E + 1) ,最少割边数 maxflow % (E + 1) 道理很简单,如果原先两类割边都是最小割,那么求出的最大流相等 但边权变换后只有边数小的才是最小割了 乘(E+1)是为了保证边数叠加后依然是余数,不至于影响求最小割的结果 因为假设最小割=k,那么现在新

hiho一下 第119周 #1398 : 网络流五&#183;最大权闭合子图 【最小割-最大流--Ford-Fulkerson 与 Dinic 算法】

#1398 : 网络流五·最大权闭合子图 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1..M),邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值. 每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行. 班级建设的活

HDU 3987 Harry Potter and the Forbidden Forest(最小割中的最少割边)经典

Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1791    Accepted Submission(s): 596 Problem Description Harry Potter notices some Death Eaters try to slip

hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割

view code//hdu 3987 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef long long ll; const ll INF = 1LL<<59; const ll E = 100001; const int N = 10

BZOJ3438 小M的作物(最小割)

题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai的收益,在B中种植可以获得bi的收益,而且,现在还有这么一种神奇的现象,就是某些作物共同种在一块耕地中可以获得额外的收益,小M找到了规则中共有m种作物组

【bzoj3438】小M的作物 网络流最小割

原文地址:http://www.cnblogs.com/GXZlegend/p/6801522.html 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号),现在,第i种作物种植在A中种植可以获得ai的收益,在B中种植可以获得bi的收益,而且,现在还有这么一种神奇的现象,就是某些作物共同种在一块耕地中可以获得额外的收益,小M找到了规则中共有m种作物组合,第i个组合中的作物共同种在A中