Courses(二分图匹配)

原题

在这里插入图片描述
在这里插入图片描述

题意

题目挺长,balabalabala说了一大堆,其实就是有p门课程,每门课程可能有不止一名学生选。一名学生只能代表一门课程,问是否每个课程都能有一个学生代表。

思路

嘛,就是二分图匹配一下,看最大匹配数是否等于课程数即可。

#include<stdio.h>
#include<string.h>
#define mem(x) memset(x,0,sizeof(x))
#define N 310
int dis[N][N],book[N];
int b[N],t,p,n;
bool found(int x)
{
    for(int i=1;i<=n;i++){
        if(dis[x][i]&&!book[i]){
            book[i]=1;
            if(b[i]==0||found(b[i])){
                b[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d",&t);
    while(t--){
        int k,x;
        mem(dis),mem(b);
        scanf("%d%d",&p,&n);
        for(int i=1;i<=p;i++){
            scanf("%d",&k);
            for(int j=1;j<=k;j++){
                scanf("%d",&x);
                dis[i][x]=1;
            }
        }
        int ans=0;
        for(int i=1;i<=p;i++){
            mem(book);
            if(found(i)) ans++;
        }
        if(ans==p)
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
发布了85 篇原创文章 · 获赞 10 · 访问量 5227

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/105422052