NYoj 239 :月老的难题(二分图最大匹配,匈牙利算法)
2016-05-07 16:31
711 查看
月老的难题
时间限制: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
一开始用的邻接矩阵搞得,结果一直超时,超时,后来改为邻接表,A了........以此为戒(稀疏矩阵还是邻接矩阵吧....)
上代码:
#include<iostream> #include<cstring> #include<vector> #include<cstdio> using namespace std; //int map[505][505];//值为1代表互相有好感,0代表为无好感 vector<int>map[505];//采用邻接表存.....邻接矩阵超时,果断放弃了... int book[505]; int match[505];//下标代表女生,值记录匹配的男生; int ans; int n; bool dfs(int x) { for(int y=0;y<map[x].size();y++)//push_back是从零下标开始的; { if(map[x][y]&&!book[map[x][y]]) { book[map[x][y]]=1; if(!match[map[x][y]]||dfs(match[map[x][y]]))//名花为主,或者尝试抢一抢 { match[map[x][y]]=x; return true; } } } return false; } int main() { int t,m; cin>>t; while(t--) { memset(map,0,sizeof(map)); memset(match,0,sizeof(match)); ans=0; scanf("%d%d",&n,&m); int x,y; while(m--) { scanf("%d%d",&x,&y); map[x].push_back(y); } for(int i=1;i<=n;i++)//从第一个男孩起解决情感问题 { memset(book,0,sizeof(book)); if(dfs(i)) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 把小人移动到鼠标点击的位置
- 俄罗斯方块中方块的旋转变形
- 50030(jobtracker.jsp)监控不到eclipse提交的作业
- 将DataTable作为ListView数据源
- Form,tagName和nodeName的区别
- FileSystemWatcher使用方法
- Material Design控件使用(二)
- JSP+Servlet实现注册登录功能
- 直观理解C语言中指向一位数组与二维数组的指针
- swift 泛型
- sigprocmask函数总结
- <html>文档类型
- NYOJ - 会场安排问题
- HDU_1227_Fast Food_动态规划
- 利用arduino 控制舵机转动
- 单调旋转数组的TopK问题
- C++实验5-数组分离
- java的路径研究
- 框架选择的原因及其说明
- Elasticsearch+Logstash+Kibana教程