这题有多个解……
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1100;
int line[N][N];
int nx[N];
int girl[N],used[N];
int m,n,t;
bool found(int x)
{
for(int i=1; i<=t; i++)
{
if(line[x][i]&&!used[i])
{
used[i]=1;
if(girl[i]==0||found(girl[i]))
{
girl[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&m,&n) && !(n==0 && m==0))
{
memset(line,0,sizeof(line));
memset(girl,0,sizeof(girl));
t=0;
for(int i=1; i<=m; i++)
{
int j;
scanf("%d",&j);
while(j--)
nx[++t]=i;
}
for(int i=1; i<=n; i++)
{
int cou;
int tmp;
scanf("%d",&cou);
for(int j=0; j<cou; j++)
{
scanf("%d",&tmp);
for(int o=1; o<=t; o++)
if(nx[o]==tmp)
line[i][o]=1;
}
}
int ans=0;
for(int i=1; i<=n; i++)
{
memset(used,0,sizeof(used));
if(found(i)) ans++;
}
if(ans==t)
{
printf("1\n");
int tmp=0;
for(int i=1; i<=t; i++)
{
if(tmp++==0)
printf("%d",girl[i]);
else
printf(" %d",girl[i]);
if(nx[i]!=nx[i+1])
{
printf("\n");
tmp=0;
}
}
}
else
printf("0\n");
}
return 0;
}