poj 1466二分匹配

//男生和女生匹配
//匈牙利算法
#include <iostream>
#include <cstring>
using namespace std;

#define MAXN 510

int mk[MAXN];
int n;

int G[MAXN][MAXN];

int cx[MAXN],cy[MAXN];
int nx,ny;
int ans;

int path(int u)
{
  for(int v = 0; v < n; 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()
{
  int res = 0;
  memset(cx,0xff,sizeof(cx));
  memset(cy,0xff,sizeof(cy));
  for(int i = 0; i < n; i++)
    {
      if(cx[i] == -1)
	{
	  memset(mk,0,sizeof(mk));
	  res += path(i);
	}
    }
  return res;
}

int main()
{
  while(cin>>n)
    {
      memset(G,0,sizeof(G));
      char str;
      int stu_num,num;
      for(int i = 0; i < n; i++)
	{
	  cin>>stu_num>>str;
	  cin>>str>>num>>str;
	  for(int e = 0; e < num; e++)
	    {
	      cin>>stu_num;
	      G[i][stu_num] = 1;
	    }
	}

      ans = MaxMatch();
      //cout<<n-ans<<endl;
      cout<<n - (ans/2)<<endl;
    }
  return 0;
}

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