二分图匹配入门---匈牙利算法

匿名 (未验证) 提交于 2019-12-02 23:57:01

超好玩匹配
很详细的二分图

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; }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!