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

题目大意:

一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成:

1.每个学生选的都是不同的课(即不能有两个学生选同一门课)

2.每门课都有一个代表(即P门课都被成功选过)

输入为:

第一行一个T代表T组数据

P N(P课程数, N学生数)

接着P行:

第几行代表第几门课程,首先是一个数字k代表对这门课程感兴趣的同学的个数,接下来是k个对这门课程感兴趣同学的编号。

输出为:

若能满足上面两个要求这输出”YES”,否则为”NO”

注意:是课程匹配的学生,学生没课上没事.....

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 505
bool G[maxn][maxn];///图存储
bool vis[maxn];///标记点是否被遍历过
int P[maxn];///表示第i个学生选的是第P[i]门课程
int n, m;///n门课程   m个学生

bool Find(int u)
{
    for(int i=1; i<=m; i++)
    {
        if(G[u][i] && !vis[i])///判断第i个学生是否喜欢第U门课, 并且判断第i个学生是否被遍历过
        {
            vis[i] = true;///标记第i个学生被遍历过了
            if( !P[i] || Find(P[i]) )/**判断第i个学生是否选过课了,如果选过了就看看能否更改这个学生所选的课程,让这个学生选u这门课*/
            {///如果u这门课 i是可以选的,退出函数完成筛选,否则继续为u进行挑选学生,直到没有
                P[i] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    int T, v, j, i, k;
    scanf("%d", &T);

    while(T--)
    {
        memset(G, false, sizeof(G));
        memset(P, 0, sizeof(P));
        scanf("%d %d",&n, &m);

        for(i=1; i<=n; i++)
        {
            scanf("%d", &k);
            while(k --)
            {
                scanf("%d", &v);
                G[i][v] = true;
            }

        }

        for(j=1; j<=n; j++)
        {/**我们每一次进行搜索的时候所有的点都要置为未遍历,因为我们每一次选课都要重新分配课程*/
            memset(vis, false, sizeof(vis));
        /**判断 j 课程是否找到了自己的学生**/
            if( !Find(j) )
                break;
        }

        if( j == n + 1)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}
时间: 2024-12-15 14:13:52

HDU 1083 Courses(最大匹配模版题)的相关文章

HDU 2222-Keywords Search-AC自动机模版题

纯粹的模版... 学习模版总会是一个快乐的过程.... #include <cstdio> #include <cstdlib> #include <string> #include <climits> #include <iostream> #include <vector> #include <set> #include <cmath> #include <cctype> #include &l

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

hdu2063 匈牙利算法 二分最大匹配模版题

过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或P

hdu 1083 Courses(二分图匹配)

Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4278    Accepted Submission(s): 2036 Problem Description Consider a group of N students and P courses. Each student visits zero, one or

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——1005Number Sequence(模版题 二维矩阵快速幂+操作符重载)

Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 148003    Accepted Submission(s): 35976 Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A

HDU ACM 2222-&gt;AC自动机模版题(入门题)

题意:预先给你一些单词,然后给你一个字符串,在判断有多少个单词出现在这个字符串中. 分析:使用AC自动机解决.下面是自己写的类模版.可以直接使用.最后记得释放内存. #include<iostream> #include<queue> using namespace std; #define LETTER_COUNT 26 class AC_Automation { private: struct Node { Node* fail; //失败指针 Node* next[LETTE

hdu 1083 Courses

描述:有p门的课,每门课都有若干学生,现在要为每个课程分配一名课代表,每个学生只能担任一门课的课代表,如果每个课都能找到课代表,则输出"YES",否则"NO". 二分匹配 #include<iostream> #include<cstring> #define maxn 305 using namespace std; int c,s; int rem[maxn][maxn]; int visit[maxn],map[maxn]; int d

HDU 2222 AC自动机(模版题)

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 70290    Accepted Submission(s): 23917 Problem Description In the modern time, Search engine came into the life of everybody lik