指引
jzoj 2319
题目大意:
在平面上有n个人和出口,一个出口只能让一个人进,每个人只能向右向上走,问最多让多少个人到出口
输入样例:
6
3
2 0
3 1
1 3
4 2
0 4
5 5
输出样例:
2
解题思路:
直接用匈牙利算法(详情见https://blog.csdn.net/ssllyf/article/details/86657342)计算最大匹配即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int t,n,xx,yy,tot,ans,x[1050],y[1050],ck[1050],p[1050],head[1050];
struct rec
{int to,next;
}a[1000500];
bool hg(int dep)//匈牙利算法
{for (int i=head[dep];i;i=a[i].next)if (!p[a[i].to]){int l=ck[a[i].to];ck[a[i].to]=dep;p[a[i].to]=1;if(!l||hg(l)) return true;ck[a[i].to]=l;}return false;
}
int main()
{scanf("%d %d",&t,&n);for (int i=1;i<=n;++i)scanf("%d %d",&x[i],&y[i]);for (int i=1;i<=n;++i){scanf("%d %d",&xx,&yy);for (int j=1;j<=n;++j)if (x[j]<=xx&&y[j]<=yy){a[++tot].to=i;//连边a[tot].next=head[j];head[j]=tot;}}for (int i=1;i<=n;++i){memset(p,0,sizeof(p));if(hg(i)) ans++;}printf("%d",ans);return 0;
}