过山车(匈牙利算法模板)

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

输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0 1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。

对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。

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

 

3

 

 

看了下匈牙利算法,把邻接矩阵改成了邻接表,个人觉得会降低点时间、空间复杂度= = 

匈牙利算法的思路,或者说精髓所在,就是

先拿当前的这个和能匹配的匹配上,如果后面的和这个抢的话,给这个后面的腾位置(当前的换成其他的,递归实现),

要是腾不了,抱歉,后面 的那个你匹配不上咯,每一个都试一下,最后统计下就可以了

 

 

#include
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
struct Edge{
    int to,nex;
}E[maxn<<2];
int head[maxn],cnt,n,m,k;
int pre[maxn];
bool vis[maxn];
void init(){
    memset(head,-1,sizeof(head)),cnt = 0;
    memset(pre,-1,sizeof(pre));
}
void add(int u,int v){
    E[cnt] = {v,head[u]};
    head[u] = cnt++;
}
int dfs(int cur){
    for(int i=head[cur];~i;i=E[i].nex){
        if(!vis[E[i].to]){
            vis[E[i].to] = 1;
            if(pre[E[i].to] == -1 || dfs(pre[E[i].to])){///没被别人匹配上,或者原来匹配上的给腾了地方,那当前的就可以匹配上了
                pre[E[i].to] = cur;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    while(cin>>k && k){
        init();
        cin>>m>>n;
        for(int i=0;i>a>>b;
            add(a,b);
        }
        int ans = 0;
        for(int i=1;i<=m;i++){
            memset(vis,0,sizeof(vis));
            if(dfs(i))
                ans++;
        }
        cout<

 

 

你可能感兴趣的:(模板类(什么,这也是模板))