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;
}
浙公网安备 33010602011771号