zoukankan      html  css  js  c++  java
  • BZOJ 1711. [Usaco2007 Open]Dining吃饭

    传送门

    好像是挺显然的网络流...

    源点向每个 $food$ 连流量为 $1$ 的边,$drink$ 向汇点连流量为 $1$ 的边

    每个牛拆成两个点 $i,n+i$ 之间流量为 $1$,对应的 $food$ 连向 $i$,$n+i$ 连向对应的 $drink$

    然后最大流

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=5e5+7,INF=1e9+7;
    int n,F,D,ans;
    int fir[N],from[N<<1],to[N<<1],val[N<<1],cntt=1;
    inline void add(int a,int b,int c)
    {
        from[++cntt]=fir[a]; fir[a]=cntt;
        to[cntt]=b; val[cntt]=c;
        from[++cntt]=fir[b]; fir[b]=cntt;
        to[cntt]=a; val[cntt]=0;
    }
    int dep[N],S,T;
    queue <int> Q;
    bool BFS()
    {
        for(int i=0;i<=T;i++) dep[i]=0;
        dep[S]=1; Q.push(S);
        while(!Q.empty())
        {
            int x=Q.front(); Q.pop();
            for(int i=fir[x];i;i=from[i])
            {
                int &v=to[i]; if(dep[v]||!val[i]) continue;
                dep[v]=dep[x]+1; Q.push(v);
            }
        }
        return dep[T]>0;
    }
    int DFS(int x,int mxfl)
    {
        if(x==T||!mxfl) return mxfl;
        int fl=0,res;
        for(int i=fir[x];i;i=from[i])
        {
            int &v=to[i]; if(dep[v]!=dep[x]+1||!val[i]) continue;
            if( res=DFS(v,min(val[i],mxfl)) )
            {
                val[i]-=res; mxfl-=res;
                fl+=res; val[i^1]+=res;
                if(!mxfl) break;
            }
        }
        return fl;
    }
    int c[233],d[233];
    int main()
    {
        n=read(),F=read(),D=read(); S=0,T=n*2+F+D+1;
        int a,b;
        for(int i=1;i<=n;i++) add(i,n+i,1);
        for(int i=1;i<=F;i++) add(S,n*2+i,1);
        for(int i=1;i<=D;i++) add(n*2+F+i,T,1);
        for(int k=1;k<=n;k++)
        {
            a=read(),b=read();
            for(int i=1;i<=a;i++) c[i]=read(),add(n*2+c[i],k,1);
            for(int i=1;i<=b;i++) d[i]=read(),add(n+k,n*2+F+d[i],1);
        }
        while(BFS()) ans+=DFS(S,INF);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    String
    Map和Set
    js的栈与堆
    js的私有属性
    随便谈一谈原型
    前端页面优化提速
    nth-child和nth-of-type
    重复输出字符串
    闭包
    mongodb内嵌文档的查询
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11417412.html
Copyright © 2011-2022 走看看