• UESTC 1962 天才钱vs学霸周2 最大流


    题目:http://www.qscoj.cn/#/problem/show/1962

    建立一个源点s和汇点t

    每个点预置1后流量最小值就变成了0

    将a[i]连接到s,b[i]连接到t

    再将每行的点连接到每列,流量为19

    再跑一次dinic

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    using namespace std;
    const int N=1e5+5;
    const int inf=0x3f3f3f3f;
    int c[105][105];
    int a[N],b[N];
    int n,m;
    struct Dinic
    {
        int s,t,tot;
        int head[N],nt[N],to[N],val[N],dep[N],cur[N];
        void init(int ss,int tt)
        {
            s=ss;
            t=tt;
            tot=-1;
            memset(head,-1,sizeof(head));
            memset(nt,-1,sizeof(nt));
        }
        void addedge(int u,int v,int w)
        {
            nt[++tot]=head[u];
            to[tot]=v;
            val[tot]=w;
            head[u]=tot;
            nt[++tot]=head[v];
            to[tot]=u;
            val[tot]=0;
            head[v]=tot;
        }
        bool bfs()
        {
            queue<int> que;
            while(!que.empty())
                que.pop();
            memset(dep,0,sizeof(dep));
            dep[s]=1;
            que.push(s);
            while(!que.empty())
            {
                int u=que.front();
                que.pop();
                for(int i=head[u];i!=-1;i=nt[i])
                    if (val[i]>0&&dep[to[i]]==0)
                    {
                        dep[to[i]]=dep[u]+1;
                        que.push(to[i]);
                    }
            }
            if (dep[t]==0) return 0;
            return 1;
        }
        int dfs(int u,int dis)
        {
            if (u==t) return dis;
            for(int &i=cur[u];i!=-1;i=nt[i])
                if (dep[to[i]]==dep[u]+1&&val[i]>0)
                {
                    int di=dfs(to[i],min(dis,val[i]));
                    if (di>0)
                    {
                        val[i]-=di;
                        val[i^1]+=di;
                        return di;
                    }
                }
            return 0;
        }
        int dinic()
        {
            int ans=0;
            while(bfs())
            {
                for(int i=s;i<=t;i++)
                    cur[i]=head[i];
                while(int d=dfs(s,inf))
                    ans+=d;
            }
            int flag=1;
            int s=0;
            for(int i=1;i<=n;i++) s+=a[i];
            if (ans!=s) flag=0;
            if (flag)
            {
                printf("Yes
    ");
                for(int i=1;i<=n;i++)
                    for(int j=head[i];j!=-1;j=nt[j])
                        c[i][to[j]-n]=20-val[j];
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;j<m;j++)
                        printf("%d ",c[i][j]);
                    printf("%d
    ",c[i][m]);
                }
            }
            else printf("No
    ");
            return 0;
        }
    };
    
    Dinic dinic;
    int main()
    {
        scanf("%d%d",&n,&m);
        int t1=0,t2=0;
        for(int i=1;i<=n;i++) {scanf("%d",&a[i]);a[i]-=m;t1+=a[i];}
        for(int i=1;i<=m;i++) {scanf("%d",&b[i]);b[i]-=n;t2+=b[i];}
        if (t1!=t2)
        {
            printf("No
    ");
            return 0;
        }
        dinic.init(0,n+m+1);
        for(int i=1;i<=n;i++)
            dinic.addedge(0,i,a[i]);
        for(int i=1;i<=m;i++)
            dinic.addedge(i+n,n+m+1,b[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            dinic.addedge(i,n+j,19);
        dinic.dinic();
        return 0;
    }
    

      

  • 相关阅读:
    第六章学习小结
    malloc iOS
    iOS事件传递机制
    对 runloop 的理解
    深恶痛绝重写setter和getter
    数据库常见问题总结
    iOS多应用自动打包
    一段文字中包含多种语言时行间距问题
    一个成熟应用的排版方案
    Flask纪要
  • 原文地址:https://www.cnblogs.com/bk-201/p/9312188.html
Copyright © 2020-2023  润新知