• poj 1149经典网络流构图


    题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量。

    思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连其第一次购买的客户,容量为其猪的个数,随后链接其下一次购买的客户容量为无穷。最后每个客户与其汇点相连,数量为想要购买的个数。

    一开始没想出来,其实对于每个需求,只要控制好其源点容量的进入和汇点的控制,对于其中间过程给一个无穷的容量便可作网络流了。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define MAXN 2000
    #define INF 1e8
    int n,m,t;
    int a[MAXN];
    int fa[10*MAXN];
    struct edge
    {
        int u,v,w,next;
    }E[200000];
    
    int head[MAXN],ecnt;
    int gap[MAXN],cur[MAXN],pre[MAXN],dis[MAXN];
    int scr,sink,vn;
    void Insert(int u,int v,int w)
    {
        E[ecnt].u=u;
        E[ecnt].v=v;
        E[ecnt].w=w;
        E[ecnt].next=head[u];
        head[u]=ecnt++;
        E[ecnt].u=v;
        E[ecnt].v=u;
        E[ecnt].w=0;
        E[ecnt].next=head[v];
        head[v]=ecnt++;
    }
    int Sap(int s,int t,int n)//核心代码(模版)
    {
        int ans=0,aug=INF;//aug表示增广路的流量
        int i,v,u=pre[s]=s;
        for(i=0;i<=n;i++)
        {
            cur[i]=head[i];
            dis[i]=gap[i]=0;
        }
        gap[s]=n;
        bool flag;
        while(dis[s]<n)
        {
            flag=false;
            for(int &j=cur[u];j!=-1;j=E[j].next)//一定要定义成int &j,why
            {
                v=E[j].v;
                if(E[j].w>0&&dis[u]==dis[v]+1)
                {
                    flag=true;//找到容许边
                    aug=min(aug,E[j].w);
                    pre[v]=u;
                    u=v;
                    if(u==t)
                    {
                        ans+=aug;
                        while(u!=s)
                        {
                            u=pre[u];
                            E[cur[u]].w-=aug;
                            E[cur[u]^1].w+=aug;//注意
                        }
                        aug=INF;
                    }
                    break;//找到一条就退出
                }
            }
            if(flag) continue;
            int mindis=n;
            for(i=head[u];i!=-1;i=E[i].next)
            {
                v=E[i].v;
                if(E[i].w>0&&dis[v]<mindis)
                {
                    mindis=dis[v];
                    cur[u]=i;
                }
            }
            if((--gap[dis[u]])==0) break;
            gap[dis[u]=mindis+1]++;
            u=pre[u];
        }
        return ans;
    }
    
    void build()
    {
    	memset(head,-1,sizeof(head));ecnt=0;
    	scr=0;sink=n+1;vn=sink+1;
    	int num;
    	memset(fa,0,sizeof(fa));
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&num);
    		while(num--)
    		{
    			int v;
    			scanf("%d",&v);
                if(!fa[v])
                {
                	Insert(0,i,a[v]);
                	fa[v]=i;
                }
                else
    			{
    				Insert(fa[v],i,INF);
    				fa[v]=i;
    			}
    		}
    		scanf("%d",&num);
    		Insert(i,n+1,num);
    	}
    }
    int main()
    {
    	while(scanf("%d%d",&m,&n)!=EOF)
    	{
    		for(int i=1;i<=m;i++)
    		{
    			scanf("%d",&a[i]);
    		}
    		build();
    		printf("%d
    ",Sap(scr,sink,vn));
    	}
    }
    


     

  • 相关阅读:
    python并发编程的几种方法
    pycharm pytest 运行时报错 gbk
    mac m1 安装python3
    python json.dumps 打印出后为乱码 解决方法
    git ssh密匙配置
    登录接口需html中的token时,需用requests-html库
    代码服务器运行时找不到包文件位置
    mac终端使用iterm及主题 高亮
    Mac 生成项目目录树形结构
    mac 安装xcode命令行工具
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134102.html
Copyright © 2020-2023  润新知