POJ 2239 Selecting Courses

二分图的最大匹配。课程和时间可以看做二分图。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int MAXN=505;
int nx,ny;
int g[MAXN][MAXN];
int cx[MAXN],cy[MAXN];
int mk[MAXN];
int n;
int ZH[10000];

int path(int u)
{
    for(int v=0; v<ny; v++)
    {
        if(g[u][v]&&!mk[v])
        {
            mk[v]=1;
            if(cy[v]==-1||path(cy[v]))
            {
                cx[u]=v;
                cy[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int MaxMatch()
{
    int res=0;
    memset(cx,-1,sizeof(cx));
    memset(cy,-1,sizeof(cy));
    for(int i=0; i<nx; i++)
    {
        if(cx[i]==-1)
        {
            memset(mk,0,sizeof(mk));
            res=res+path(i);
        }
    }
    return res;
}

int main()
{
    int i,t,p,q;
    while(~scanf("%d",&nx))
    {
        memset(g,0,sizeof(g));
        for(i=0;i<10000;i++) ZH[i]=-1;
        ny=0;
        for(i=0;i<nx;i++)
        {
            scanf("%d",&t);
            while(t--)
            {
                scanf("%d%d",&p,&q);
                if(ZH[p*100+q]==-1)
                {
                    ZH[p*100+q]=ny;
                    ny++;
                }
                g[i][ZH[p*100+q]]=1;
            }
        }
        printf("%d\n",MaxMatch());
    }
    return 0;
}
时间: 2024-10-27 16:48:20

POJ 2239 Selecting Courses的相关文章

POJ 2239 Selecting Courses【最大匹配】

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

poj——2239 Selecting Courses

poj——2239   Selecting Courses Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10656   Accepted: 4814 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the c

POJ 2239 Selecting Courses(二分匹配)

题目链接:http://poj.org/problem?id=2239 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming is a student who loves study every much, and at the beginning

Poj 2239 Selecting Courses 【二分匹配】

Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9007 Accepted: 4010 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming i

[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(二分匹配简单模板)

http://poj.org/problem?id=2239 这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第p天的第q节课上 其中二分图的X集合里表示课程i,那么我们要解决的就是Y集合了 将第i门课在一周的第p天的第q节课上进行编号,这样Y集合就是 上课时间的编号了 #include<stdio.h> #include<string.h> #include<math.h> #in

POJ 2239 Selecting Course 二分图匹配(水)

http://poj.org/problem?id=2239 题意:总共7天,每天有12个教室使用,每门课有(t,pi,qi) 表示该门课每周开t次在第qi天,第pi间教室i=1..t 总共n门课 n<=300,问最多能选多少种不同的课程? 左边点为课程 右边点为(p,q) 把(p,q)看成排列中的序数 化成整数(p-1)*12+q.求二分图的最大匹配即可 复杂度为O(nm) #include <iostream> #include <cstring> #include &l

POJ 2239 二分图匹配/Hungary

Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8667 Accepted: 3863 Description It is well known that it is not easy to select courses in the college, for there is usually conflict among the time of the courses. Li Ming i

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

匈牙利算法模板题 有n门课程,每门课程可能有不同一时候间,不同一时候间的课程等价. 问不冲突的情况下最多能选多少门课. 建立二分图,一边顶点表示不同课程,还有一边表示课程的时间(hash一下). #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include