NYOJ 239 月老的难题 (深度优先遍历)

2014-11-24 13:25:57 · 作者: · 浏览: 40

月老的难题

时间限制: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

题目分析:

我的做法是设两个数组visBoy[],visGirl[],用来表示某个男孩或者女孩是否已经访问了.

第一种情况,男孩没有访问,与他配对的女孩也没有访问,最简单的情况,计数器加一;

第二种情况,男孩没访问,但与他配对的女孩已经访问(与其他男孩配对),这时可以判断一下与该女孩配对的男孩可不可以换一个女生,如果可以的话,计数器加一;

代码如下:


/*************************************************************************
    > File Name: match_maker.c
    > Author: litingdong
    > Mail: litingdong2012@gmail.com 
    > Created Time: 2014年05月23日 星期五 20时34分36秒
 ************************************************************************/

#include
      
       
#include
       
         #include
        
          #define MAXN 501 #define N 10001 int head[N]; struct EDGE { int to,next; }edge[N]; int m=0; int visBoy[MAXN]; int visGirl[MAXN]; void add_edge(int u,int v) { edge[m].to=v; edge[m].next=head[u]; head[u]=m++; } int dfs(int boy) { int girl; int i; for(i=head[boy];i!=-1;i=edge[i].next) { girl=edge[i].to; if(!visBoy[girl]) { visBoy[girl]=1; if(!visGirl[girl]||dfs(visGirl[girl])) { visGirl[girl]=boy;//存的是与她配对的男生的编号. return 1; } } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); memset(visGirl,0,sizeof(visGirl)); m=0;//极其关键,相当于初始化edge[N]; int n,k; scanf("%d%d",&n,&k); int i; for(i=0;i
         
          


<script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: C++基础知识面试精选100题系列(11-20题)[C++ basics]
下一篇: 最后一页
相关文章
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=303650&catid=339&title=TllPSiAgMjM5ICDUwsDPtcTE0cziICjJ7rbI08XPyLHpwPop&forward=http://www.2cto.com/kf/201405/303650.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");