匈牙利算法

来源:互联网 发布:bamboo mac 手绘 编辑:程序博客网 时间:2024/05/20 18:51
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<vector>#include<stack>#include<queue>#include<map>#define RG register#define IL inline#define pi acos(-1.0)#define ll long long using namespace std;const int maxn = 210;int n,m,x,y,ans=0;int a[maxn],b[maxn];//a:匹配点连向的被匹配点,b:被匹配点连向的匹配点bool vis[maxn],g[maxn][maxn];bool dfs(int u) {  for(int i=1; i<=m; i++)     if(g[u][i] && !vis[i]) {      vis[i]=1;      if(dfs(b[i]) || b[i]==-1) {b[i]=u,a[u]=i;return true;      }    }  return false;}int main() {  scanf("%d%d", &n, &m);  while(scanf("%d%d", &x, &y)!=EOF) g[x][y]=1;  memset(a,-1,sizeof(a));  memset(b,-1,sizeof(b));  for(int i=1; i<=n; i++) {    if(a[i]==-1) {      memset(vis,0,sizeof(vis));//增广路上的点只能匹配一次      if(dfs(i)) ans++;    }  }  printf("%d", ans);  return 0;}

原创粉丝点击