zoukankan      html  css  js  c++  java
  • 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));
    	}
    }
    


     

  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134102.html
Copyright © 2011-2022 走看看