poj 2239(二分图匹配)

题意:有n门课,每门课都有一些上课时间,周几的第几节课,一个人想报尽量多的课但时间不能冲突,问最多能报多少门课。

题解:只需要把课程当做一个集合,上课时间当做另一个集合,然后把每个课程和它的上课时间(时间可以用(p - 1) * 12 + p表示)都加一条边到图里,找最大匹配数让每个课程至少对应一个上课时间。

#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = 303;
int n, link[N], vis[N];
vector<int> g[N];

bool dfs(int u) {
    for (int i = 0; i < g[u].size(); i++) {
        int v = g[u][i];
        if (!vis[v]) {
            vis[v] = 1;
            if (link[v] == -1 || dfs(link[v])) {
                link[v] = u;
                return true;
            }
        }
    }
    return false;
}

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

int main() {
    while (scanf("%d", &n) == 1) {
        int cla, p, q;
        for (int i = 0; i < n; i++) {
            g[i].clear();
            scanf("%d", &cla);
            while (cla--) {
                scanf("%d%d", &p, &q);
                g[i].push_back((p - 1) * 12 + q);
            }
        }
        printf("%d\n", hungary());
    }
    return 0;
}
时间: 2024-10-17 11:07:47

poj 2239(二分图匹配)的相关文章

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

POJ 2446 二分图匹配

题意:给你一个n*m方格 让你用1*2的的小方格去铺满,其中有k个方格不能被铺到. 思路:二分图建图, 以每个格子为点建图,如果可以用一块1*2的小方格铺到,就连一条边. 每个格子在X集合和Y集合都有一个点,只要任意一边被匹配到了就算可以,然后就是二分图匹配了. 上代码. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector

POJ 1325 二分图匹配/匈牙利算法

Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11922 Accepted: 5077 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling p

poj 1325(二分图匹配)

题意:有两台机器有各有n和m种模式(都是从0开始编号),有k个任务,每个任务可以是第一台机器的x模式或第二台机器的y模式,每台机器切换模式都要重启(重启后初始模式是0),问最少次数重启使所有任务完成. 题解:把任务当做边,两台机器的模式放在不同集合中,那么就是二分图的最小点集覆盖问题,注意模式0可以不计算,因为重启初始模式就是0,不需要花费重启次数. #include <stdio.h> #include <string.h> const int N = 105; int n, m

POJ 3041 -- 二分图匹配

题意:有个N*N的网格,有一部分格子里有陨石,小明有很牛逼的武器,打一枪后一行或一列的陨石就没了,给出陨石分布,求最小打炮数. 分析:其实就是Konig定理.记最小打炮数为m,在网格里你最多可以找出M个互相之间既不在同一行又不在同一列的元素,也就是说你再找一个元素它必定与已有的某个元素同行或同列,Konig定理就是:m = M.至于具体打时是打某一行还是某一列,要看剩下的元素与现有元素共行或共列的情况了. 那么问题就转化成找出这M个陨石,把行和列看做一个二分图,那么找M就是找最大匹配了. 和PO

Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数                   证明:https://blog.csdn.net/qq_34564984/article/details/52778763 证明总的来说就是尽可能多得连边 边越多 可以打包一起处理得点就越多(这里题中打包指连续得两个点只需要一条线段就能覆盖) 拆点思想   :匈牙

POJ - 1904 King&#39;s Quest(强连通分量+二分图匹配)

题目大意:有N个帅哥和N个美女,现在给出每个帅哥所喜欢的美女的编号,和一个帅哥和美女的完美匹配 问每个帅哥可以娶多少个美女,且当他娶完这个美女后,剩下的人还可以完美匹配 解题思路:神题啊,给一个大神的详细解答 具体是这样的,首先先建边,把帅哥和能娶到的美女连边,再把完美匹配的美女和帅哥连边,这样就形成了一张有向图了 接着,找出这张有向图的所有强连通分量,在强连通分量里面的帅哥都可以娶到自己喜欢的美女,且娶完这个美女后,不会影响到其他人 为什么呢? 假设xi为帅哥,yi和yj为美女,假设给定的完美

二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041

最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 比较简单,用的经典的二分图匹配算法. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

POJ 2195 二分图最小权匹配KM算法

本来是打算昨天晚上写的, 昨天网速渣的连CSDN都进不去,没办法 只能现在来写了 先写写对KM算法的理解,KM算法是对每个点设置一个顶标,只有当边长等于两边点的顶标之和的时候才进行增广,这样就能保证得到的一定是最大权匹配. 如果找不到匹配的时候就对交替路中X集合的顶标减少一个d Y集合的顶标增加一个d. 这样两个点都在交替路中的时候x[i]+y[i]的和不边 X在 Y不在的时候x[i]+y[i]减少,可能就会为图增加一对匹配. X不在Y在的时候x[i]+y[i]增加, 原来不在现在依然不在其中.