• POJ 1149 PIGS (最大流)


    连接:http://poj.org/problem?id=1149

    第一道网络流,求最大流部分基本都是模板,基本的难点在于怎样构图。

    每一个顾客、一个源点和一个汇点构成一个图,每一个猪圈的第一个打开它的顾客 直接与源点相连 容量为该猪圈的猪的个数。不是首次打开猪圈的话,顾客j紧跟着顾客i之后打开某个猪圈。那么农场主能够依据j的需求来调整这个猪圈的流动路径。每一个顾客到汇点相连容量为该顾客的需求,终于源点能提供全部的猪,汇点流出的就是全部顾客购买的猪的总数 也就是 农场主能卖出的猪。构造完图之后套一个最大流模板 ^ ^


    /*--------------------- #headfile--------------------*/
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cstdlib>
    #include <cassert>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <set>
    #include <map>
    /*----------------------#define----------------------*/
    #define DRII(X,Y) int (X),(Y);scanf("%d%d",&(X),&(Y))
    #define EXP 2.7182818284590452353602874713527
    #define CASET int _;cin>>_;while(_--)
    #define RII(X, Y) scanf("%d%d",&(X),&(Y))
    #define DRI(X) int (X);scanf("%d", &X)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define rep(i,n) for(int i=0;i<n;i++)
    #define ALL(X) (X).begin(),(X).end()
    #define INFL 0x3f3f3f3f3f3f3f3fLL
    #define RI(X) scanf("%d",&(X))
    #define SZ(X) ((int)X.size())
    #define PDI pair<double,int>
    #define rson o<<1|1,m+1,r
    #define PII pair<int,int>
    #define MAX 0x3f3f3f3f
    #define lson o<<1,l,m
    #define MP make_pair
    #define PB push_back
    #define SE second
    #define FI first
    typedef long long ll;
    template<class T>T MUL(T x,T y,T P){T F1=0;while(y){if(y&1){F1+=x;if(F1<0||F1>=P)F1-=P;}x<<=1;if(x<0||x>=P)x-=P;y>>=1;}return F1;}
    template<class T>T POW(T x,T y,T P){T F1=1;x%=P;while(y){if(y&1)F1=MUL(F1,x,P);x=MUL(x,x,P);y>>=1;}return F1;}
    template<class T>T gcd(T x,T y){if(y==0)return x;T z;while(z=x%y)x=y,y=z;return y;}
    #define DRIII(X,Y,Z) int (X),(Y),(Z);scanf("%d%d%d",&(X),&(Y),&(Z))
    #define RIII(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
    const double pi = acos(-1.0);
    const double eps = 1e-6;
    const ll mod = 1000000007ll;
    const int M = 1005;
    const int N = 105;
    using namespace std;
    
    /*----------------------Main-------------------------*/
    struct Edge {
        int to, c, rev;
        Edge() {}
        Edge(int _to, int _c, int _rev) {
            to = _to, c = _c, rev = _rev;
        }
    };
    vector<Edge> G[N];
    int lv[N], iter[N];
    int n, m;
    void BFS(int s) {
        mem(lv, -1);
        queue<int> q;
        lv[s] = 0;
        q.push(s);
        while(!q.empty()) {
            int v = q.front(); q.pop();
            for(int i = 0; i < SZ(G[v]); i++) {
                Edge &e = G[v][i];
                if(e.c > 0 && lv[e.to] < 0) {
                    lv[e.to] = lv[v] + 1;
                    q.push(e.to);
                }
            }
        }
    }
    int dfs(int v, int t, int f) {
        if(v == t) return f;
        for(int &i = iter[v]; i < SZ(G[v]); i++) {
            Edge &e = G[v][i];
            if(e.c > 0 && lv[v] < lv[e.to]) {
                int d = dfs(e.to, t, min(f, e.c));
                if(d > 0) {
                    e.c -= d;
                    G[e.to][e.rev].c += d;
                    return d;
                }
            }
        }
        return 0;
    }
    int MF(int s, int t) {
        int res = 0;
        for( ; ; ) {
            BFS(s);
            if(lv[t] < 0) return res;
            mem(iter, 0);
            int f;
            while((f = dfs(s, t, 1e9)) > 0) {
                res += f;
            }
        }
    }
    void add(int from, int to, int c) {
        G[from].PB( Edge(to, c, SZ(G[to])) );
        G[to].PB( Edge(from, 0, SZ(G[from]) - 1) );
    }
    int a[M], la[M];
    void solve() {
        while(RII(m, n) != EOF) {
            for(int i = 1; i <= m; i++) RI(a[i]);
            for(int i = 0; i <= n + 1; i++) G[i].clear();
            int s = 0, t = n + 1;
            mem(la, 0);
            for(int i = 1; i <= n; i++) {
                DRI(A);
                for(int j = 0; j < A; j++) {
                    DRI(x);
                    int W = la[x] == 0 ? a[x] : 1e9;
                    add(la[x], i, W);
                    la[x] = i;
                }
                DRI(B);
                add(i, t, B);
            }
            printf("%d
    ", MF(s, t));
        }
    }
    
    int main() {
    //    freopen("in.txt", "r", stdin);
    //    freopen("out.txt", "w", stdout);
    //    CASET
        solve();
        return 0;
    }
    


  • 相关阅读:
    三十岁前不要去在乎的29件事
    大型网站架构演变和知识体系
    性情中人。。。
    blog搬新家了。。。把以前的文章也都搬过来了。看看以前的文章,想起了很多。。。
    2006620 11:42:00 王子劳尔,王者归来
    2006620 11:40:00 这一刻,便是我们的永远给最爱的安德烈.舍普琴科
    第一份工作一定要选一家好公司 摘在 唐骏 《我的成功可以复制》
    2006811 11:29:00 搜索算法及其在ACM竞赛中的应用(作者/刘力科 计算机系01级4班)
    内核学习驱动隐藏进程
    2005129 17:58:00 新年快乐
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6941137.html
Copyright © 2020-2023  润新知