nyoj 239 月老的难题【匈牙利算法+邻接表】
2015-08-06 18:46
573 查看
月老的难题
时间限制:1000 ms | 内存限制:65535 KB难度:4
描述
月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。
现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭。
现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福家庭数量吧。
假设男孩们分别编号为1~n,女孩们也分别编号为1~n。
输入第一行是一个整数T,表示测试数据的组数(1<=T<=400)
每组测试数据的第一行有两个整数n,K,其中男孩的人数与女孩的人数都是n。(n<=500,K<=10 000)
随后的K行,每行有两个整数i,j表示第i个男孩与第j个女孩有可能结成幸福的家庭。(1<=i,j<=n)输出对每组测试数据,输出最多可能促成的幸福家庭数量样例输入
1 3 4 1 1 1 3 2 2 3 2
样例输出
2 典型的匈牙利算法模板,但是必须要用邻接表做,用邻接矩阵会超时
#include<stdio.h> #include<string.h> #define MAX 10010 int head[MAX],cnt; int vis[MAX],girl[MAX]; int n,m; struct node { int u,v; int next; }edge[MAX]; void add(int u,int v) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } int find(int x) { int i,j; for(i=head[x];i!=-1;i=edge[i].next) { int y=edge[i].v; if(!vis[y]) { vis[y]=1; if(girl[y]==0||find(girl[y])) { girl[y]=x; return 1; } } } return 0; } int main() { int t,i,j; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); memset(girl,0,sizeof(girl)); cnt=0; scanf("%d%d",&n,&m); for(i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); } int sum=0; for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) sum++; } printf("%d\n",sum); } }
相关文章推荐
- Log4J2.3版本简单测试验证
- java数据库连接过程
- jvm内存设置
- 黑马程序员 oc随机 写个关联
- nprogress页面加载进度条使用
- 用户分群画像:抽样“猜想”让位于大数据“观察”
- openfire3.10.1环境搭建
- Android中 View not attached to window manager错误的解决办法
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
- 开始app开发的工作小结
- 【linux高级程序设计】(第十五章)UDP网络编程应用 4
- 内存池(一)
- Screen position out of view frustum
- Hdoj 2795 Billboard
- EventBus实例教程(二)
- Detect the target host network whether can ping through or not(shell script)
- 错误No Persistence provider for EntityManager named
- HDU 5360 Hiking
- Microsoft C#基础知识复习
- 在云环境下利用Teraproc集群即服务实现R代码的GPU加速