nicholas

nicholas
pku 1469

最大匹配  啥也不说了

#include <iostream>
using namespace std;

//二分图最大匹配,hungary算法,邻接阵形式,复杂度O(m*m*n)
//返回最大匹配数,传入二分图大小m,n和邻接阵mat,非零元素表示有边
//match1,match2返回一个最大匹配,未匹配顶点match值为-1
#include <string.h>
#define MAXN 310
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)

int hungary(int m,int n,int mat[][MAXN],int* match1,int* match2){
 int s[MAXN],t[MAXN],p,q,ret=0,i,j,k;
 for (_clr(match1),_clr(match2),i=0;i<m;ret+=(match1[i++]>=0))
  for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++)
   for (k=s[p],j=0;j<n&&match1[i]<0;j++)
    if (mat[k][j]&&t[j]<0){
     s[++q]=match2[j],t[j]=k;
     if (s[q]<0)
      for (p=j;p>=0;j=p)
       match2[j]=k=t[j],p=match1[k],match1[k]=j;
    }
 return ret;
}


int mat[MAXN][MAXN];
int match1[MAXN],match2[MAXN];

int p,n;

void init()
{
 int i,j,x,t;

 memset(mat,0,sizeof(mat));

 scanf("%d%d",&p,&n);
 for (i=0;i<p;i++)
 {
  scanf("%d",&x);
  for (j=0;j<x;j++)
  {
   scanf("%d",&t);
   mat[i][t-1]=1;
  }
 }
}


int main()
{
 int t;
 scanf("%d",&t);
 while (t--)
 {
  init();

  if (hungary(p,n,mat,match1,match2)==p) printf("%s\n","YES");
  else
   printf("%s\n","NO");
 }
 return 0;
}


 

posted on 2007-09-06 21:09  zy_nic  阅读(317)  评论(0)    收藏  举报