【二分匹配】HDU1083-Courses

Courses
Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3645    Accepted Submission(s): 1745

Problem Description
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 student in the committee represents a different course (a student can represent a course if he/she visits that course)

. each course has a representative in the committee

Your program should read sets of data from a text file. The first line of the input file contains the number of the data sets. Each data set is presented in the following format:

P N
Count1 Student1 1 Student1 2 ... Student1 Count1
Count2 Student2 1 Student2 2 ... Student2 Count2
......
CountP StudentP 1 StudentP 2 ... StudentP CountP

The first line in each data set contains two positive integers separated by one blank: P (1 <= P <= 100) - the number of courses and N (1 <= N <= 300) - the number of students. The next P lines describe in sequence of the courses . from course 1 to course
P, each line describing a course. The description of course i is a line that starts with an integer Count i (0 <= Count i <= N) representing the number of students visiting course i. Next, after a blank, you'll find the Count i students, visiting the course,
each two consecutive separated by one blank. Students are numbered with the positive integers from 1 to N.

There are no blank lines between consecutive sets of data. Input data are correct.

The result of the program is on the standard output. For each input data set the program prints on a single line "YES" if it is possible to form a committee and "NO" otherwise. There should not be any leading blanks at the start of the line.

An example of program input and output:
 

Sample Input
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
 

Sample Output
YES
NO
 

Source
Southeastern Europe 2000
 

 

 

p门课,每门课有若干名学生喜欢,一共有N个学生,每个学生可以喜欢多门课,写出每门课以及喜欢这门课的学生,
求是否能为所有的课安排班长(一个人只能任命为一门课的班长),如果能输出“YES”,不能输出“NO”
思路:
将学生看成A集合,课程看成B集合,即求A集合中给的元素(数量可多于B集合)是否能够
完全匹配上B集合的所有元素(每个A只能和B中某些元素匹配)
明显的二分匹配,用匈牙利算法
AC代码:

#include<stdio.h>
#include<string.h>
int course[510],flag[510],line[510][510];//被HDU坑了,数组显然比100和300要大才能AC
int n,m;
int Find(int x)
{
    int i;
    for(i=1;i<=m;i++)//遍历所有被选课
    {
       if(line[x][i]==1&&flag[i]==0)
       {//如果 x喜欢i课且在这一个递归选取阶段没有被选取(哪怕是暂时选取,新的递归可能会换)
          flag[i]=1;//标记被选取
          if(course[i]==0||Find(course[i]))//如果被选课没有班长或它的班长可以调换(它的班长可以选择其它被选课)
          {
             course[i]=x;//将i课的班长定为 x
             return 1;
          }
       }
    }
    return 0;
}
int main()
{
    int i,j,T,x,y,k,sum;
    scanf("%d",&T);
    while(T--)
    {
       scanf("%d %d",&m,&n);//m是课程数,n是学生数目,别弄反了!!!
       memset(line,0,sizeof(line));
       memset(course,0,sizeof(course));
       for(i=1;i<=m;i++)
       {
          scanf("%d",&x);
          while(x--)
          {
             scanf("%d",&y);
             line[y][i]=1;//表示 y学生喜欢 i课
          }
       }
       sum=0;//记录能选的班长数
       for(i=1;i<=n;i++)
       {
          memset(flag,0,sizeof(flag));//每次都要清 0
          if(Find(i)) sum++;//找到一对就记录
       }

       if(sum==m)
       printf("YES\n");
       else
       printf("NO\n");
    }
    return 0;
}
时间: 2025-01-21 14:34:30

【二分匹配】HDU1083-Courses的相关文章

二分匹配最大匹配的理解(附图解)

  定义 一个PXP的有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联:(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次):如果不考虑图中存在回路,那么每条路径就是一个弱连通子集. 由上面可以得出: 1.一个单独的顶点是一条路径: 2.如果存在一路径p1,p2,......pk,其中p1 为起点,pk为终点,那么在覆盖图中,顶点p1,p2,......pk不再与其它的顶点之间存在有向边. 路径

【二分匹配】HDU1068-Girls and Boys

说说什么是最大独立集 在二分图中, 独立集指的是两两之间没有边的顶点的集合, 顶点最多的独立集成为最大独立集. 二分图的最大独立集=节点数-最大匹配数 例子: 1 2 - 1' 3 - 2' 4 - 3'        4' 最大独立集=8-3=5. 最大独立集是1,2,3,4,4'   例题: Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

【算法导论】最大二分匹配

        最大二分匹配问题在现实生活中比较普遍,常常出现在任务分配上.例如,有5个员工,4个不同的任务,而不同员工能够完成不同或相同的任务.也就是说,有的员工只会做这个任务,有的员工会做那个任务,有的员工会做一些任务.图解如下:左边代表员工,右边代表任务,连线代表有能力完成.   我们的问题是合理安排员工,尽可能地完成最多的任务数.上图中阴影部分为一种最好的分配方式.前一篇文章中,我们介绍了最大流问题,在这里我们可以将最大二分匹配问题转变成最大流问题.具体如下图所示:   其中每条边的最大

poj 2226 Muddy Fields(合理建图+二分匹配)

/* 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 思路: 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩阵中只有0, 1,然后让我们通过选择一行,或者 是一列将其所在行的或者所在列的 1全部删掉,求出最少需要几步? 这道题的思路就是:将行标 和 列标值为1的建立一条边!通过匈牙利算法可以得到这个二分图的最大匹配数 最大匹配数==最小顶点覆盖数!最小顶点覆盖就是用最少的点覆盖了这个二分图的所有的边,然后去掉这些 最小覆

图的匹配问题与最大流问题(五)计算二分图的最大匹配

二分图的最大匹配问题第一篇已经说过,下面看看百度百科给的一些解释: 给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 极大匹配(Maximal Matching)是指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数.最大匹配(maximum matching)是所有极大匹配当中边数最大的一个匹配.选择这样的边数最大的子集称为图的最大匹配问题. 如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配

数学建模十大算法

作者:July  二零一一年一月二十九日   一.蒙特卡罗算法1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis 共同发明了,蒙特卡罗方法. 此算法被评为20世纪最伟大的十大算法之一,详情,请参见我的博文:http://blog.csdn.net/v_JULY_v/archive/2011/01/10/6127953.aspx   蒙特卡罗方法(Monte Carlo method),又称随机抽样或统计模拟方法

Pregel: A System for Large-Scale Graph Processing

作者Grzegorz Malewicz, Matthew H. Austern .etc.Google Inc 2010-6 原文http://people.apache.org/~edwardyoon/documents/pregel.pdf 译者phylips@bmy 2012-09-14 译文http://duanple.blog.163.com/blog/static/70971767201281610126277/ [说明Pregel这篇是发表在2010年的SIGMOD上Pregel这

HDU2063-过山车

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10683    Accepted Submission(s): 4699 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩, 就是每个女生必须找个个男生做p

c++-在做一个暴力破解密文的课设,如何快速地匹配文件中的单词?

问题描述 在做一个暴力破解密文的课设,如何快速地匹配文件中的单词? 最近在做一个课程设计,是关于暴力破解密文的.文件中大约有9000个单词,每个单词 占一行,如何快速地去匹配单词呢? 解决方案 先字典序排序.然后二分查找,这是我的想法,当然我觉得也可以用更高级的字符串匹配算法