TOJ 1050 Courses 二分匹配

有了匈牙利算法的基础,该题就是一道非常简单的题目了,大致题意:该题给出P门课程,N个学生,问能否从中选出P个学生,使每个学生上不同的课,且每个课程有一个学生。典型的二分图匹配的问题,我们只要计算最大二分图匹配数,如果和课程数相同就输出YES,否则输出NO。

代码如下:

貌似输入需要用scanf ,cin 会 超时;

#include <stdio.h>
#include <string.h>
int map[305][305];
int path[305],C,P;
bool visited[305];
int dfs(int a)
{
   for(int i=1;i<=P;i++)
   {
       if(map[a][i]&&!visited[i])
       {
           visited[i]=1;
           if(!path[i]||dfs(path[i]))
           {
               path[i]=a;
               return 1;
           }
       }
   }
   return 0;
}
int main()
{
    int cases;
    scanf("%d",&cases);
    while(cases--)
    {
        scanf("%d%d",&C,&P);
        memset(map,0,sizeof(map));
        memset(path,0,sizeof(path));
        int count,st,ans=0;
        for(int i=1; i<=C; i++)
        {
            scanf("%d",&count);
            for(int j=0; j<count; j++)
            {
                scanf("%d",&st);
                map[i][st]=1;
            }
        }
            for(int i=1; i<=C; i++)
            {
                memset(visited,0,sizeof(visited));
                if(dfs(i)) ans++;
            }
        if(ans==C) printf("YES\n");
        else printf("NO\n");
    }
}


你可能感兴趣的:(匈牙利算法,TOJ)