zoukankan      html  css  js  c++  java
  • 二分图求最大匹配

    HDU 过山车

    RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?

    Input输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
    1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。Output对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。Sample Input

    6 3 3
    1 1
    1 2
    1 3
    2 1
    2 3
    3 1
    0

    Sample Output

    3


    由X集合出发 寻找增广路 找到一个贡献++;



    code
    //
    #include<bits/stdc++.h>
    using namespace std;
    #define maxnn 3000
    int k,n,m;
    int las[maxnn],nex[maxnn],en[maxnn],tot;
    int x,y;
    int cros[maxnn],mat[maxnn];
    int ans=0;
    void init()
    {
        memset(mat,-1,sizeof(mat));
        ans=0;
        memset(las,0,sizeof(las));
        tot=0;
    }
    bool F(int x)
    {
        for(int i=las[x];i;i=nex[i])
        {
            int v=en[i];
            if(!cros[v])
            {
                cros[v]=1;    //一定要标为1 不然死循环
                if(mat[v]==-1||F(mat[v]))  //未被匹配 或者 当前的匹配边可以寻到另一条匹配边  即为找到一条增广路
                {
                    mat[v]=x;
                    return true;
                }
                
            }
        }
        return false;
     } 
    int hungary()
    {
        for(int i=1;i<=m;i++)
        {
            memset(cros,0,sizeof(cros));
            if(F(i))
            ans++;
        }
        cout<<ans<<endl;
    }
    void add(int a,int b)
    {
        en[++tot]=b;
        nex[tot]=las[a];
        las[a]=tot;
    }
    int main()
    {
        while(cin>>k)
        {
            if(k==0)
            return 0;cin>>m>>n;
            init();
            {
                for(int i=1;i<=k;i++)
                {
                    cin>>x>>y;
                    add(x,y);
                
                }
            }    hungary();
        }
     } 
    刀剑映出了战士的心。而我的心,漆黑且残破
  • 相关阅读:
    OpenCV 笔记 (C++模板template)
    C++中预定义的运算符的操作对象只能是基本的数据类型
    linux-CentOS6.4下安装oracle11g详解
    Eclipse 连接MySql数据库总结
    六个创建模式之单例模式(Singleton Pattern)
    六个创建模式之抽象工厂模式(Abstract Factory Pattern)
    六个创建模式之工厂方法模式(Factory Method Pattern)
    六个创建模式之简单工厂模式(Simple Factory Pattern)
    搜狗实习面试
    Java设计模式 -- 基本原则
  • 原文地址:https://www.cnblogs.com/OIEREDSION/p/11271494.html
Copyright © 2011-2022 走看看