月老的难题
来源:互联网 发布:路由器监控软件功能 编辑:程序博客网 时间:2024/04/29 17:17
月老的难题
时间限制: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) - 输出
- 对每组测试数据,输出最多可能促成的幸福家庭数量
- 样例输入
13 41 11 32 23 2
- 样例输出
2
- 解题思路
- 这道题可以看做二分图,起先不会做,上网百度了一下,自己理解了一下,男孩和女孩组成幸福家庭最多,其实就可以看成,一方最多能和另一方匹配成多少对,然后利用搜索,如果这个男孩能和这个女孩配对,且这个女孩没有配对过,则可以配对,或者这个女孩配对过但是这个女孩配对的男孩可以和其他女孩配对,则也可以配对
- 解题代码
#include<bits/stdc++.h>using namespace std;int n,m;int vis[505]; //vis[i]记录某男配对时是否已考虑女孩iint flag[505]; //flag[i]记录女孩i的当前男孩vector<int> e[505];bool dfs(int x){ for(int i=0; i<e[x].size(); i++) { int g=e[x][i]; if(!vis[g]) { vis[g]=1; if(flag[g]==0||dfs(flag[g])) //该女孩还没男票或这个女孩原来的男票可以另外去找别的女孩 { flag[g]=x; //男孩x与女孩g确立恋爱关系 return true; //男孩x成功找到女孩 } } } return false; //男孩x没有找到女票 T_T}int main(){ int T;scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) e[i].clear();//令所有男孩没有可选择对象 memset(flag,0,sizeof(flag)); //0即无,令所有女孩为单身 while(m--) { int x,y; scanf("%d%d",&x,&y); e[x].push_back(y); //给男孩x增加一个可选择女孩y } int num=0; //初始化成功配对数 for(int i=1; i<=n; i++) //从第一个男孩起开始解决相亲问题 { memset(vis,0,sizeof(vis)); if(dfs(i)) num++; //男孩i成功找到女朋友,成功配对数++ } printf("%d\n",num); }}
1 0
- nyoj 月老的难题
- 月老的难题 nyist239
- 月老的难题
- nyoj 月老的难题
- nyoj239月老的难题
- 月老的难题
- NYOJ239月老的难题
- nyoj239月老的难题
- 月老的难题
- NYOJ239月老的难题
- NYOJ-239 月老的难题
- NYOJ 239 月老的难题
- NYOJ 239 月老的难题
- 月老的难题 南工239
- NYOJ 239-月老的难题
- nyoj 239 月老的难题
- NYOJ-239 月老的难题
- 二分匹配 月老的难题
- hadoop2.x完全分布式安装配置
- APP开发中,ios时间显示可能为NaN问题
- spring security 自定义filter 会话失效问题
- hiho1505 : 小Hi和小Ho的礼物描述
- 04-软件设计方案
- 月老的难题
- C++ Primer Chapter 3
- Composer -- PHP依赖管理的新时代
- Raid Card CC(consistency check )
- 下各节已定义,但尚未为布局页“~/Views/Shared/_Layout.cshtml”呈现:“Scripts
- sql server 使用总结
- best-time-to-buy-and-sell-stock i &ii
- db2 update注意的问题
- Android 设备兼容