暑假集训每日一题 0726 (二分图匹配)

题目大意:有n个学生和p门课程,每个学生选修了p门课程中的一些,问能否找到p个课代表,一个人最多只能当一门课的课代表。

分析:建立二分图,求最大匹配,判断最大匹配数目是否为p

View Code
#include <stdio.h>
#include <string.h>
#define N 301
int g[N][N];
int x[N],y[N],vis[N];
int p,n;
int path(int u)
{
    int v;
    for(v=1;v<=p;v++)   if(!vis[v]&&g[u][v])
    {
        vis[v]=1;
        if(y[v]==-1 || path(y[v]))
        {
            x[u]=v;
            y[v]=u;
            return 1;
        }
    }
    return 0;
}
int maxmatch()
{
    int i,ret=0;
    memset(x,-1,sizeof(x));
    memset(y,-1,sizeof(y));
    for(i=1;i<=n;i++)
    {
        if(x[i]!=-1)    continue;
        memset(vis,0,sizeof(vis));
        ret+=path(i);
    }
    return ret;
}
int main()
{
    int t,i,j,cnt;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&p,&n);
        memset(g,0,sizeof(g));
        for(i=1;i<=p;i++)
        {
            scanf("%d",&cnt);
            while(cnt--)
            {
                scanf("%d",&j);
                g[j][i]=1;
            }
        }
        if(maxmatch()==p)   puts("YES");
        else    puts("NO");
    }
    return 0;
}
posted @ 2012-07-26 17:25  BeatLJ  阅读(148)  评论(0编辑  收藏  举报