二分匹配最大匹配 PKU1469

一个学生可以有多种选择,问能否每个学生刚好选一门课,但是每门课最多只有一个学生可以选择

典型的二分匹配最大匹配,直接套模板

COURSES

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 17878   Accepted: 7048

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

Input

Your program should read sets of data from the std input. The first line of the input 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抣l 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.

Output

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.

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

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <limits.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <deque>
#include <vector>
#include <set>
#include <map>
#include <memory.h>
using namespace std;

bool g[110][310];//邻接矩阵,true代表有边相连
bool flag,vis[310];//记录v2中的某个点是否被搜索过
int match[310];//记录与v2中的点匹配的点的编号
int p,n;//二分图中左边,右边集合顶点的个数

//匈牙利算法
bool DFS(int u){
    int i;
    for(i=1;i<=n;++i){
        if(g[u][i] && !vis[i])//如果节点i与u相连并且没有被查找过
        {
            vis[i] = true;
            if(match[i]==-1 || DFS(match[i]))//如果i没有在前一个匹配M中,或者i在匹配M中,但是从与i相邻的节点出发可以找到增广路径
            {
                match[i] = u;//记录查找成功记录,更新匹配M(就是取反)
                return true;//返回查找成功
            }
        }
    }

    return false;
}

int main(){
    int i,j,k,t,v,ans;

    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&p,&n);
        for(i=1;i<=p;i++){
            for(j=1;j<=n;j++){
                g[i][j] = false;
            }
        }
        for(i=1;i<=n;i++){
            match[i] = -1;
        }
        flag = true;
        for(i=1;i<=p;i++){
            scanf("%d",&k);
            if(k == 0){
                flag = false;
            }
            while(k--){
                scanf("%d",&v);
                g[i][v] = true;
            }
        }
        if(flag==true){
            ans = 0;
            for(i=1;i<=p;i++){
                memset(vis,false,sizeof(vis));//清空上次搜索时的标记
                if(DFS(i)==true){
                    ans++;
                }
            }
            if(ans == p){
                printf("YES\n");
            }
            else{
                printf("NO\n");
            }
        }
        else{
            printf("NO\n");
        }
    }

    return 0;
}

时间: 2024-10-14 07:46:06

二分匹配最大匹配 PKU1469的相关文章

hdu2444 The Accomodation of Students(判断二分匹配+最大匹配)

//判断是否为二分图:在无向图G中,如果存在奇数回路,则不是二分图.否则是二分图. //判断回路奇偶性:把相邻两点染成黑白两色,如果相邻两点出现颜色相同则存在奇数回路.也就是非二分图. # include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int vis[210],map[210][210],cott[210]; int c[210]; int flag,n

ZOJ 1516 Uncle Tom&#39;s Inherited Land(二分匹配 最大匹配 匈牙利啊)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=516 Your old uncle Tom inherited a piece of land from his great-great-uncle. Originally, the property had been in the shape of a rectangle. A long time ago, however, his great-great-uncl

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

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

POJ 1274 The Perfect Stall(二分匹配 最大匹配数)

题目链接:http://poj.org/problem?id=1274 Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the firs

HDU 2063 过山车(二分匹配入门)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配最大匹配数简单题,匈牙利算法.学习二分匹配传送门:http://blog.csdn.net/dark_scope/article/details/8880547 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using nam

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

二分+二分匹配

给了一个矩阵 n行m列 选n个数 要保证这n个数不在同行同列,计算出第k大的数最小 , 二分答案,然后我们对于每个a[i][j]<=mid的我们就i和j建立一条边 然后二分求最大匹配必须大于等于n-k-1(因为是第k大 而不是第k小 坑了好久才发现) #include <algorithm> #include <stdio.h> #include <string.h> #include <vector> #include <iostream>

LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

#2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 N NN 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N NN 个数中第 K KK 大的数字的最小值是多少. 输入格式 第一行给出三个整数

HNU13377 Book Club(二分匹配)

题意:有n个人,m种需求,给出m行,每行a,b代表a想要的书在b那里,问能不能通过交换的方法来满足每个人的需求 思路:这题有好多做法..刚上来思路也有好多 想到了判环,但是如果两环相切这判断很罗嗦,干脆用二分匹配来的直接 就是n与n匹配,想清楚这点就很简单了,版子题了 就是人跟人的最大匹配数嘛.. /* *********************************************** Author :devil Created Time :2016/4/4 14:36:38 ***