poj 1325 二分匹配

//匈牙利算法
//将机器A上的任务和机器B上的进行匹配
//最大匹配即为问题的解
#include <iostream>
#include <cstring>
#define MAXN 110
using namespace std;

int nx,ny;
int G[MAXN][MAXN];
int cx[MAXN],cy[MAXN];
int mk[MAXN];

int ans;

int path(int u)
{
  for(int v = 1; v <= ny; v++)
    {
      if(G[u][v] && !mk[v])
	{
	  mk[v] = 1;
	  if(cy[v] == -1 ||path(cy[v]))
	    {
	      cx[u] = v;
	      cy[v] = u;
	      return 1;
	    }
	}
    }
  return 0;
}

int MaxMatch()
{
  ans = 0;
  memset(cx,0xff,sizeof(cx));
  memset(cy,0xff,sizeof(cy));
  for(int i = 1; i <= nx; i++)
    {
      if(cx[i] == -1)
	{
	  memset(mk,0,sizeof(mk));
	  ans += path(i);
	}
    }
}

int main()
{
  int k;
  int x,y,z;
  while(cin>>nx)
    {
      memset(G,0,sizeof(G));
      if(nx == 0)
	break;
      cin>>ny>>k;
      for(int i = 0; i < k; i++)
	{
	  cin>>z>>x>>y;
	  G[x][y] = 1;
	}
      MaxMatch();
      cout<<ans<<endl;
    }
  return 0;
}

你可能感兴趣的:(poj 1325 二分匹配)