HDU 1083 — Courses

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1083

题意:

有p个课程n个学生;

学生可以自由选择课程,但一个学生只能代表一个课程;

接下来p行,第i行表示第i门课,第一个数m为选该门课的人数,然后列出这m个人;

问是否每门课都有学生代表;


思路:

就是求最大匹配,若匹配数为p,则YES,否则NO;



#include<stdio.h>
#include<vector>
#include<string.h>
#include<iostream>
#include<algorithm>

using namespace std;
const int maxn = 550;
int p, n;
int lef[maxn];  
bool T[maxn];   
vector<int>G[maxn];  
bool match(int x)    
{    
    for(int i = 0;i<G[x].size();i++)    
    {    
        int v = G[x][i]; 
        if(!T[v])    
        {    
            T[v] = true;    
            if(lef[v] == -1 || match( lef[v] ))    
            {    
                lef[v] = x;    
                return true;    
            }    
        }    
    }    
    return false;    
}    
    
int solve()    
{    
    memset(lef, -1, sizeof(lef));    
    int ans = 0;    
    for(int i = 1;i<=p;i++)    
    {       
        memset(T, 0, sizeof(T));    
        if( match(i) )     
        ans++;    
    }    
    return ans;    
}   

int main()
{
	int cas;
	scanf("%d", &cas);
	while(cas--)
	{
		scanf("%d%d", &p, &n);
		
		for(int i = 1;i<=p;i++)
		{
			int cnt;
			G[i].clear();
			scanf("%d", &cnt);
			while(cnt--)
			{
				int x;
				scanf("%d", &x);
				G[i].push_back(x);
			}
		}
		if(solve() == p)
		printf("YES\n");
		else
		printf("NO\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值