过山车(二分图匹配入门题)

原题

1
2

思路

就是一道单纯的二分图匹配,用一个二维数组记录联系即可
易错点:这题的数据先给的女生,后给的男生数据。定义n和m的话不要用混,统计最大匹配对数用的是女生人数,函数found遍历的男生人数

#include<stdio.h>
#include<string.h>
#define mem(x) memset(x,0,sizeof(x))
#define N 510
int b[N],book[N];
int dis[N][N];
int t,n,m;
bool search(int x)
{
    for(int i=1;i<=n;i++) //还有的题型是每个人对应一个区间
    {
        if(dis[x][i]&&!book[i])  //这里的book[i],在递归的时候判段一个人原配是否已被占据
        {
            book[i]=1;  //标记i已被占据
          if(b[i]==0||search(b[i])) //单身,或者其影响到的所有人都可以换掉原配而不影响
          {
             b[i]=x;
             return true;
          }
        }
    }
    return false;
}
int main()
{
    while(~scanf("%d",&t)&&t){
        scanf("%d%d",&m,&n);
        int x,y;
        mem(dis),mem(b);
        for(int i=0;i<t;i++){
            scanf("%d%d",&x,&y);
            dis[x][y]=1;
        }
        int ans=0;
        for(int i=1;i<=m;i++){
           mem(book);  //因为每次都要尝试是否能占据别人原配,增加整体配对数
           if(search(i))ans++;
           //这有2种情况,1是i可以配对(找到单身人士,或者占据已配对的人
           //且已配对的人都可以找到新配偶而达到增加整体配对数
           //2是不行,别人无论怎么调换也腾不出来配偶给i
        }
        printf("%d\n",ans);
    }
    return 0;
}
发布了85 篇原创文章 · 获赞 10 · 访问量 5228

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/105421481
今日推荐