zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [CF600E]Lomsat gelral
    [BZOJ3237]连通图
    [CF580D]Kefa and Dishes
    [BZOJ4726]Sabota?
    bzoj2120&&2453 -- 带修改莫队
    bzoj4726 [ POI2017 ] -- 树形DP
    bzoj2809 [ APIO2012 ] -- 主席树
    bzoj4216 -- 分块
    bzoj4173 -- 欧拉函数
    bzoj2982 -- Lucas定理
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4718556.html
Copyright © 2011-2022 走看看