zoukankan      html  css  js  c++  java
  • poj3281 拆点+网络流

    和上题一样,水过。

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define MAXN 815
    #define INF 1e8
    #define min(a,b) (a<b?a:b)
    #define max(a,b) (a>b?a:b)
    using namespace std;
    struct edge
    {
        int u,v,w,next;
    }E[200000];
    int head[MAXN],ecnt;
    int gap[MAXN],cur[MAXN],pre[MAXN],dis[MAXN];
    int l,r,mid;
    int N,M,scr,sink,vn,num;
    int k,c1,m;
    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;
    }
    int n,f,d;
    int main()
    {
       while(scanf("%d%d%d",&n,&f,&d)!=EOF)
       {
           memset(head,-1,sizeof(head));ecnt=0;
           scr=0;sink=f+d+2*n+1;vn=sink+1;
           for(int i=1;i<=f;i++)
            Insert(scr,i,1);
           for(int i=1;i<=d;i++)
            Insert(i+f,sink,1);
           for(int i=1;i<=n;i++)
           {
               Insert(i+d+f,i+d+f+n,1);
               int x,y;int v;
               scanf("%d%d",&x,&y);
               for(int j=1;j<=x;j++)
               {
    
                   scanf("%d",&v);
                   Insert(v,i+f+d,1);
               }
               for(int j=1;j<=y;j++)
               {
    
                   scanf("%d",&v);
                   Insert(i+f+d+n,v+f,1);
               }
           }
        printf("%d\n",Sap(scr,sink,vn));
       }
       return 0;
    }
    


     

  • 相关阅读:
    MongoDB的基础连接
    Pygame的图像移动
    Pygame的KEYDOWN和KEYUP
    Pygame的程序开始
    Tkinter的MessageBox组件
    流程控制语句-if...else语句
    流程控制语句-if判断
    分享数组概念、创建、赋值、长度与使用
    js入门与实战课前准备和编辑工具介绍
    JavaScript进阶篇-JS基础语法
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134143.html
Copyright © 2011-2022 走看看