月老的难题

时间限制: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>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>map[550];
int pipei[550],used[550];
int find(int x)
{
int y;
for(int i=0;i<map[x].size();i++)
{
y=map[x][i];
if(!used[y])
{
used[y]=1;
if(!pipei[y]||find(pipei[y]))
{
pipei[y]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
map[i].clear();
pipei[i]=0;
}
int x,y,sum=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
map[x].push_back(y);
}
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
sum+=find(i);
}
printf("%d\n",sum);
}
return 0;
}

最新文章

  1. phpexcel 导出 科学计数问题
  2. map和list遍历基础
  3. 扩展GridView控件——为内容项添加拖放及分组功能
  4. [转发]Linux的系统调用宏
  5. ssh增加密匙登录
  6. ubuntu文件夹右键没有共享选项
  7. Android开发之Action Bar
  8. word2vec c代码使用说明
  9. 018 关联映射文件中&lt;class&gt;标签中的lazy(懒加载)属性
  10. 锁对象Lock
  11. 【Swift】IOS开发中自定义转场动画
  12. Spring揭秘 读书笔记 五 容器的启动
  13. python-tqdm进度条
  14. DOM编程以及domReady加载的几种方式
  15. JsRender练习总结
  16. 使用GSON工具实现json和其他数据格式间转换
  17. 008_python内置语法
  18. 微信开发】【Asp.net MVC】-- 微信分享功能
  19. 当try-catch-finally代码块遇上return,代码执行流程是怎样
  20. Spring cloud的Maven插件(二):run目标

热门文章

  1. 【Linux】创建逻辑卷管理(LVM)
  2. CDC之Metastability
  3. jquery的attr和prop
  4. react基础篇三
  5. Centos6.6 安装Redis
  6. 使用脚本卸载.net framework for mac
  7. js俄罗斯方块
  8. Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解
  9. AD 域服务简介(一)- 基于 LDAP 的 AD 域服务器搭建及其使用(转)
  10. Java JPA通过hql语句查询数据