poj2239 Selecting Courses --- 二分图最大匹配

匈牙利算法模板题

有n门课程,每门课程可能有不同一时候间,不同一时候间的课程等价。

问不冲突的情况下最多能选多少门课。

建立二分图,一边顶点表示不同课程,还有一边表示课程的时间(hash一下)。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define eps 1e-6
#define ll __int64
using namespace std;

int mp[310][310],used[310],link[310],n,m;

bool dfs(int x)
{
    for(int i=1;i<=m;i++)
    {
        if(!used[i]&&mp[x][i])
        {
            used[i]=1;
            if(link[i]==-1||dfs(link[i]))
            {
                link[i]=x;
                return 1;
            }
        }
    }
    return 0;
}

int hungry()
{
    int res=0;
    memset(link,-1,sizeof link);
    for(int i=1;i<=n;i++)
    {
        memset(used,0,sizeof used);
        if(dfs(i))
            res++;
    }
    return res;
}

int main()
{
    int i,a,b;
    while(~scanf("%d",&n))
    {
        memset(mp,0,sizeof mp);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d%d",&a,&b);
                mp[i][(a-1)*12+b]=1;
            }
        }
        m=7*12;
        printf("%d\n",hungry());
    }
    return 0;
}

poj2239 Selecting Courses --- 二分图最大匹配,布布扣,bubuko.com

时间: 2024-10-26 03:08:29

poj2239 Selecting Courses --- 二分图最大匹配的相关文章

[POJ] 2239 Selecting Courses(二分图最大匹配)

题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课.把n种课划分为X集合,把一周的84节课划分为Y集合, 从Xi向Yi连边,那么就转化成了求二分图的最大匹配数,然后匈牙利算法就可以了. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #includ

POJ 2239 Selecting Courses【最大匹配】

大意: 有一些课程,每个课程的上课时间在每周可能会有多节,你可以从中任选一个时间去听课, 每周七天一天12节课  告诉你每节课的上课时间问在不冲突的情况下最多上几节课? 分析: 左集合课程 右集合时间 边为该节课对应的上课时间 求最大匹配就行了 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std

POJ 1469 COURSES 二分图最大匹配

就是判断一下是不是每一个课程都能找到自己的代表人,做一遍最大匹配看看匹配数是否等于p即可 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cs

POJ2239 Selecting Courses(二分图最大匹配)

题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 using namespa

POJ2239_Selecting Courses(二分图最大匹配)

解题报告 http://blog.csdn.net/juncoder/article/details/38154699 题目传送门 题意: 每天有12节课.一周上7天,一门课在一周有多天上课. 求一周最多上几节课. 思路: 把课程看成一个集合,上课的时间看成一个集合,二分图就出来了. #include <cstdio> #include <cstring> #include <iostream> using namespace std; int n,day[10][15

HDU ACM 1083 Courses 二分图最大匹配

题意:p门课,每门课有若干学生,要为每门课分配一名课代表,每个学生只能担任一门课的课代表,若每个课都能找到课代表,则输出"YES",否则"NO". 分析:二分图的最大匹配,对课程.学生关系建立一个图,进行二分图最大匹配,当最大匹配数==课程数时说明能够满足要求,否则不能. #include<iostream> using namespace std; #define N 303 bool cs[N][N]; //cs[i][j]表示学生j是否选i这个课程

POJ2239 Selecting Courses【二分图最大匹配】

题目链接: http://poj.org/problem?id=2239 题目大意: 学校总共有N门课程,并且学校规定每天上12节可,一周上7天.给你每门课每周上的次数,和哪一天哪一节 课上的.如果有多门课程在同一天同一节课上,那么你只能选择其中一门.那么问题来了:最多能同时选多少 门课而不发生冲突呢. 输入说明: 先给你一个N,表示有N门课.接下来N行,每行第一个数字x,表示这门课每周上几节.接下来是x对数.第 一个数D表示是这一周哪一天上的,第二个数C表示是这一天哪一节课上的. 思路: 将这

POJ2239 Selecting Courses【二部图最大匹配】

主题链接: http://poj.org/problem?id=2239 题目大意: 学校总共同拥有N门课程,而且学校规定每天上12节可,一周上7天. 给你每门课每周上的次数,和哪一天哪一节 课上的.假设有多门课程在同一天同一节课上.那么你仅仅能选择当中一门.那么问题来了:最多能同一时候选多少 门课而不发生冲突呢. 输入说明: 先给你一个N.表示有N门课.接下来N行,每行第一个数字x,表示这门课每周上几节.接下来是x对数.第 一个数D表示是这一周哪一天上的,第二个数C表示是这一天哪一节课上的.

POJ 1469 COURSES (二分图最大匹配 匈牙利算法)

COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18892   Accepted: 7455 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 poss