码迷,mamicode.com
首页 > 其他好文 > 详细

二分图匹配

时间:2021-03-30 12:52:43      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:scanf   cst   names   成功   while   bool   关系   print   之间   

//二分图匹配
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1005;
int n,m,k; //a方n人 b方m人 k对关系
int u,v;
int g[N][N]; //表示a,b之间有关系,赋值为0/1.
//!若要去掉某一关系,令其=0即可
int match[N]; //下标是配对的b方 值为对应的a方
bool reserve_b[N]; //标记b方是否已经使用过
int ans;

bool dfs(int x){
for(int i=1;i<=m;i++){ //b方
if(!reserve_b[i]&&g[x][i]){
reserve_b[i]=1;
if(!match[i]||dfs(match[i])){ //b无配对 或者 b的原配可以找到新的配对
match[i]=x; //则令x为b的配对
return 1; //x找到了配对
}
}
}
return 0; //x没有找到配对
}

int main(){
// while(scanf("%d%d%d",&n,&m,&k)==3){
scanf("%d%d%d",&n,&m,&k);
memset(g,0,sizeof(g));
memset(match,0,sizeof(match));
for(int i=1;i<=k;i++){
scanf("%d%d",&u,&v);
g[u][v]=1; // 表示a,b之间有关系,也可以表示两点间有一条边
}
for(int i=1;i<=n;i++){ //a方
memset(reserve_b,0,sizeof(reserve_b)); //不加会错
//表示不论bi之前是否有配对,都不会影响它与ai的配对
if(dfs(i)) ans++; //ai配对成功后配对数++,虽然可能更换配对,但是保证ai一定有配对
}
printf("%d\n",ans);
// }
return 0;
}

二分图匹配

标签:scanf   cst   names   成功   while   bool   关系   print   之间   

原文地址:https://www.cnblogs.com/re0acm/p/14588456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!