HDU OJ 1083 Courses 【二分图匹配之最大匹配】

原题连接:点击打开链接

题意:有p门的课,每门课都有若干学生,现在要为每个课程分配一名课代表,每个学生只能担任一门课的课代表,如果每个课都能找到课代表,则输出”YES”,否则”NO”。

思路:入门的二分图最大匹配问题,求的最大匹配数ans 若 ans = p 则输出 YES,否则 NO。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector<int>V[1000];
int link[1000],use[1000];
void init(int n)
{
    int i;
    for(i=0;i<=n;i++)
      V[i].clear();
}
bool Dfs(int v)
{
    int i,j,k;
    for(i=0;i<V[v].size();i++)
    {
        k=V[v][i];
        if(!use[k])
        {
            use[k]=1;
            if(!link[k]||Dfs(link[k]))
            {
                link[k]=v;
                return true;
            }
        }
    }
    return false;
}
int MaxMatch(int n)
{
    int i,j,ans=0;
    memset(link,0,sizeof(link));
    for(i=1;i<=n;i++)
    {
        memset(use,0,sizeof(use));
        if(Dfs(i))
            ans++;
    }
    return ans;

}
int main()
{
    int i,j,n,m,k,t;
    scanf("%d",&t);
    while(t--)
    {
        int x,y;
        scanf("%d%d",&n,&m);
        init(n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            while(x--)
            {
                scanf("%d",&y);
                V[i].push_back(y);
            }
        }
        int ans=MaxMatch(n);
        if(ans==n)
          puts("YES");
        else
          puts("NO");
    }
}

点赞