题目链接

http://poj.org/problem?id=1469

解题思路

二分图匹配
提醒一下,cin好像TLE

AC代码

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=400;
vector<int> e[N];
int n,m,cnt,u,num,link[N],vis[N],T;

bool dfs(int x)
{
    for(int i=0;i<e[x].size();i++)
    {
        int v=e[x][i];
        if(vis[v]) continue;
        vis[v]=1;
        if(link[v]==0 || dfs(link[v]))
        {
            link[v]=x;
            return 1;
        }
    }
    return 0;
}

int main()
{
    cin>>T;
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(link,0,sizeof link);
        for(int i=1;i<=n;i++) e[i].clear();

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&num);
            while(num--) scanf("%d",&u),e[i].push_back(u);
        }

        int i;
        for(i=1;i<=n;i++)
        {
            memset(vis,0,sizeof vis);
            if(!dfs(i)) break;
        }
        if(i==n+1) puts("YES");
        else puts("NO");
    }
}