n个男孩子,m个女孩子,男孩子对女孩子有好感(匹配者与被匹配这的关系是有向图或无向图,此时为无向图,如果女孩子也有喜欢的男孩子的话,就是有有向图)
进行男孩子匹配
可以用二维数组来构建图的关系,line[i][j]的权值表示I对j的联通,现在是1表示i对j存在好感,当出现有权值时就不一样了.
数组girl[]表示被匹配者匹配的是谁
used[]是一个动态的清零操作数组,在每次匹配的时候记录是否被匹配
HDU2063裸匹配,匈牙利算法即可
//有向图二分最大匹配---匈牙利算法 //一个图有两个子图,一个m个结点的子图,一个n个结点的子图,前者是主动匹配,后者是用来被匹配的 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=505; int line[N][N]; int girl[N];// int used[N];//被匹配这是否被匹配,每次匹配都要进行清零操作,因为要实现腾出给其他女孩子用 int k,m,n;//可能的组合数目,女生人数,男生人数 bool find(int x){ for(int i=1;i<=n;i++){//遍历被匹配的男孩子 if(line[x][i]&&!used[i]){//如果女孩子x对i有好感且男孩子i没被匹配过 used[i]=1;//男孩子被匹配了 if(girl[i]==0||find(girl[i])){//如果该男孩子没有女孩子或者还能腾出位置,女孩子就去匹配下个男孩子 girl[i]=x;//该男孩子i匹配的女孩子是x return 1; } } } return 0; } int main(){ cin>>k>>m>>n; memset(line,0,sizeof(line)); memset(girl,0,sizeof(girl)); for(int i=0;i<k;i++){ int x,y; scanf("%d%d",&x,&y); line[x][y]=1; } int sum=0; for(int i=1;i<=m;i++){ memset(used,0,sizeof(used)); if(find(i)){ sum++; } } printf("%d\n",sum);//输出可以匹配的数 return 0; }
来源:博客园
作者:Emcikem
链接:https://www.cnblogs.com/Emcikem/p/11477227.html