Hdu 1083 Courses(匈牙利算法模版题)

Hdu 1083

题意:给你一个p表示测试组数,给你n和m表示课的个数和学生的个数,接下来n行首数字i表示该堂课的学生代表人数,之后为i个学生编码,问能否为每堂课找到一个学生课代表且不冲突;

题解:匈牙利算法模版

另附简单易懂匈牙利算法讲解:传送门

#include<cstring>
#include<cstdio>
const int N =305;
using namespace std;
bool h[N][N];
bool vis[N];
int link[N];
int n,m;
bool hungary(int x){
    for(int i=1;i<=m;i++){
        if(h[x][i]==1&&!vis[i]){
            vis[i]=1;
            if(link[i]==-1||hungary(link[i])){
                link[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&n,&m);
        memset(h,0,sizeof(h));
        memset(link,-1,sizeof(link));
        for(int i=1;i<=n;i++){
            int u;
            scanf("%d",&u);
            while(u--){
                int j;
                scanf("%d",&j);
                h[i][j]=1;
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            memset(vis,0,sizeof(vis));
            if(hungary(i))ans++;
        }
        if(ans==n)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Mrleon/p/8444775.html

时间: 2024-10-11 01:59:20

Hdu 1083 Courses(匈牙利算法模版题)的相关文章

HDU 1083 Courses(最大匹配模版题)

题目大意: 一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过) 输入为: 第一行一个T代表T组数据 P N(P课程数, N学生数) 接着P行: 第几行代表第几门课程,首先是一个数字k代表对这门课程感兴趣的同学的个数,接下来是k个对这门课程感兴趣同学的编号. 输出为: 若能满足上面两个要求这输出”YES”,否则为”NO” 注意:是课程匹配的学生,学生没课上没事.....

hdu 1083 匈牙利算法模板题

题意:有p个课程,n个学生,每个课程有x个学生喜欢.如果每个课程都至少可以分配一个学生就输出YES,否则输出NO. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 400int Map[N][N],S[N],vis[N],n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){         

hdu 2063 匈牙利算法模板题

题意:有x个男生各自有喜欢的女生,y个女生各自有喜欢的男生.互相喜欢的在一起有好感度.问怎样好感度最高. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 1500int Map[N][N],M[N],vis[N];int k,m,n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){     

匈牙利算法模板题 hdu 1150

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6339    Accepted Submission(s): 3178 Problem Description As we all know, machine scheduling is a very classical problem in compu

POJ - 1469 COURSES (匈牙利算法入门题)

题意: P门课程,N个学生.给出每门课程的选课学生,求是否可以给每门课程选出一个课代表.课代表必须是选了该课的学生且每个学生只能当一门课程的. 题解: 匈牙利算法的入门题. #include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; const int maxn = 1005; int t; int k, s; int flag

poj 1274 The Perfect Stall【匈牙利算法模板题】

The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20874   Accepted: 9421 Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering pr

hdu1150 Machine Schedule (匈牙利算法模版)

匈牙利算法本质就是一个个的匹配,对于当前的处理的对象i,假设他的匹配对象为j,但是j已经和v匹配好了,那么就让v去找找着能不能和别人匹配 v可以和别人匹配则i与j匹配,不能则i去找别人匹配 另外引入几个定义和结论: 1:最大匹配数 + 最大独立集 = n + m(n,m为二分图两边的节点数) 2:二分图的最小顶点覆盖数 = 最大匹配数 3:最小路径覆盖 = 最大独立集 最大独立集是指:求一个二分图中最大的一个点集,该点集内的点互不相连. 最小顶点覆盖是指: 在二分图中,用最少的点,让所有的边至少

HDU - 1083 Courses (二分图最大匹配模板)

题意:给出P门课程,N个学生.每一门课程可能有多个学生感兴趣然后我们需要匹配,使得每一门课程都只包含一名对其感兴趣的学生问:能否匹配成立思路:这个就是典型的二分图匹配问题.常用匈牙利算法 完整代码:(一开始写成了无向图....)写成有向图是因为学生是可以剩余的 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; c

【二分图匹配入门专题1】F - COURSES poj1469【最大匹配--匈牙利算法模板题】

Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions: every stude