月老的难题

题目链接;?pid=239

月老的难题

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

经典的题目,直接套匈牙利算法的模板就能A了, 匈牙利算法简介

【代码】

#include <iostream>#include <cstring>using namespace std;const int maxn =550;const int maxe =10500;int n,k;int head[maxn];int edgeNum;int inpath[maxn];int match[maxn];struct Edge{int to,next;}edge[maxe];void addEdge(int a,int b){edge[edgeNum].to=b;edge[edgeNum].next=head[a];head[a]=edgeNum++;}int findpath(int k){for(int i=head[k];i!=-1;i=edge[i].next){int v = edge[i].to;if(!inpath[v]){inpath[v]=1;if(match[v]==-1||findpath(match[v])){match[v]=k;return true;}}}return false;}void hungary(){int ans=0;for(int i=1;i<=n;i++){memset(inpath,0,sizeof(inpath));if(findpath(i)){ //寻找增广路ans++;}}cout<<ans<<endl;}void init(){memset(head,-1,sizeof(head));memset(match,-1,sizeof(match));edgeNum=0;}int main(){int T;cin>>T;while(T–){init();cin>>n>>k;int a,b;for(int i=0;i<k;i++){cin>>a>>b;addEdge(a,b);}hungary();}return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

你曾经说,你曾经说。走在爱的旅途,我们的脚步多么轻松……

月老的难题

相关文章:

你感兴趣的文章:

标签云: