当前位置: 代码迷 >> 综合 >> 匈牙利算法(核心过程)
  详细解决方案

匈牙利算法(核心过程)

热度:73   发布时间:2024-02-27 14:55:59.0

二分图就是俩个部分,每个部分不能有边,只能俩个部分之间有边

 

 

二分图的最大匹配数: 二分图左右俩边连接边的最大数,只能一对一。也就是说不能两条边连接同一个点

 

 

code:

#include<iostream>
#include<cstdio>
#include<cstring>using namespace std;const int N =510;
const int M = 1e5+10;int head[N],ne[M],e[M],cnt;bool st[N];//记录每个女生是否被选择过 
int match[N];//每个女生选择哪个男生 void add(int u,int v){e[cnt]=v,ne[cnt]=head[u],head[u]=cnt++;
}bool find(int x){for(int i =head[x];i!=-1;i=ne[i]){int j = e[i];if(!st[j]){//每个女生只能被选择一次 st[j]=true;if(match[j]==0||find(match[j])){//女生还没有被选择的话 或则 选择这个女生的男生可以选择其他的女生 match[j]=x;return true;} }}return false;
}int main()
{int n1, n2,m;scanf("%d%d%d",&n1,&n2,&m);for(int i = 1;i<=n1 ;i++){head[i]= -1;}int u,v;for(int i =1;i<=m;i++){scanf("%d%d",&u,&v);add(u,v);}int ans=0;for(int i = 1 ;i <= n1;i++) {//遍历每个男生 memset(st,false ,sizeof(st));//这个男生可以选择所有可以选择的女生,所以重新置为0 if(find(i)) ans++;}printf("%d\n",ans);return 0;
}

 

  相关解决方案