POJ1469[COURSES] 二分图最大匹配 匈牙利算法

题目链接


题意:题目大意:将vy个工作分配给vx个学生,求能不能每个同学都有分配到工作。


解题思路:二分图匹配,看匹配数是否等于课程数


#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 305;
const int P = 105;
int T[N], line[N], w[P][N];
int p, n;
bool find(int u){
    for ( int i=1; i<=n; i++ )
        if( !T[i] && w[u][i] ){
            T[i]=1;
            if( !line[i] || find(line[i]) ){
                line[i]=u;
                return true;
            }
        }
    return false;
} 

int Hungarian(){
    int ans=0;
    memset(line,0,sizeof(line));
    for ( int i=1; i<=p; i++ ){
        memset(T,0,sizeof(T));
        if( find(i) ) ans++;
    }
    return ans;
}

int main(){
    int tt;
    scanf("%d", &tt );
    while( tt-- ){
        memset(w,0,sizeof(w));
        scanf("%d%d", &p, &n );
        for ( int i=1; i<=p; i++ ){
            int x;
            scanf("%d", &x );
            for ( int j=1; j<=x; j++ ){
                int v;
                scanf("%d", &v );
                w[i][v]=1;
            }
        }
        (Hungarian()==p) ? puts("YES") : puts("NO"); 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值