暑假集训每日一题 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;

}

你可能感兴趣的:(二分图)