首页 > 其他分享 >[lnsyoj2594/luoguP2763] 试题库问题

[lnsyoj2594/luoguP2763] 试题库问题

时间:2025-01-22 17:31:57浏览次数:1  
标签:return 试题库 idx int res flow lnsyoj2594 luoguP2763 include

题意

假设一个试题库中有 \(n\) 道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性,但在试卷中只计一种。从题库中抽取 \(m\) 道题组成试卷,使试卷包含第 \(i\) 种试题 \(a_i\) 道,共需 \(k\) 道。

sol

建立二分图模型,使左侧点对应试题,右侧点对应类别。
每一个左侧点向对应类别的右侧点连一条容量为 \(1\) 的边,超级源点 \(S\) 向每一个左侧点连一条容量为 \(1\) 的边,每一个右侧点向超级汇点 \(T\) 连一条容量为 \(a_i\) 的边。跑最大流,当且仅当最大流 \(|f|=k\) 时有合法方案。
输出方案时,枚举每一条边即可。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

const int N = 1055, M = 44005, INF = 0x3f3f3f3f;

int h[N], e[M], f[M], ne[M], idx;
int d[N], cur[N];
int n, S, T;
int k, p, m;
vector<int> typ[N], ans[25];

void add(int a, int b, int c) {
    e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
    e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++ ;
}

void build() {
    memset(h, -1, sizeof h);
    scanf("%d%d", &k, &p);
    n = k + p + 2, S = n - 1, T = n;
    for (int i = 1; i <= p; i ++ ) add(S, i, 1);
    for (int i = 1; i <= k; i ++ ) {
        int t;
        scanf("%d", &t);
        m += t;
        add(p + i, T, t);
    }
    for (int i = 1; i <= p; i ++ ) {
        int t, tp;
        scanf("%d", &t);
        for (int j = 1; j <= t; j ++ ) {
            scanf("%d", &tp);
            add(i, p + tp, 1);
            typ[i].push_back(tp);
        }
    }
}

bool bfs() {
    queue<int> q;
    memset(d, -1, sizeof d);
    d[S] = 0, cur[S] = h[S], q.push(S);
    while (!q.empty()) {
        int t = q.front(); q.pop();
        for (int i = h[t]; ~i; i = ne[i]){
            int j = e[i];
            if (d[j] == -1 && f[i]) {
                d[j] = d[t] + 1;
                cur[j] = h[j];
                if (j == T) return true;
                q.push(j);
            }
        }
    }
    return false;
}

int find(int u, int limit) {
    if (u == T) return limit;
    int flow = 0;
    for (int i = cur[u]; ~i && flow < limit; i = ne[i]) {
        cur[u] = i;
        int j = e[i];
        if (d[j] == d[u] + 1 && f[i]) {
            int t = find(j, min(limit - flow, f[i]));
            if (!t) d[j] = -1;
            f[i] -= t, f[i ^ 1] += t, flow += t;
        }
    }

    return flow;
}

int dinic() {
    int res = 0, flow;
    while (bfs()) while (flow = find(S, INF)) res += flow;
    return res;
}

void print(int res) {
    if (res != m) puts("No Solution!");
    else {
        for (int i = (p + k) * 2 + 1, u = 1; u <= n; u ++ )
            for (int x : typ[u]) {
                if (f[i]) ans[x].push_back(u);
                i += 2;
            }
        
        for (int i = 1; i <= k; i ++ ) {
            printf("%d: ", i);
            for (int x : ans[i]) printf("%d ", x);
            puts("");
        }
    }
}

int main(){
    build();

    int res = dinic();

    print(res);
}

标签:return,试题库,idx,int,res,flow,lnsyoj2594,luoguP2763,include
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/luoguP2763

相关文章

  • 计算机毕设项目源码 大数据深度学习 高校竞赛试题库管理平台
    标题:高校竞赛试题库管理平台高校竞赛试题库管理平台旨在为高校教师和学生提供一个高效的管理系统,用于创建、管理和分享各类竞赛试题。以下是该系统的基本框架,包括主要模块及其功能简介:1.用户管理模块用户注册与登录:提供教师、学生和管理员的注册与登录功能。不同角色的......
  • w108精品在线试题库系统设计与实现
    ......
  • HW机试题库(个人总结)
    业余算法爱好者,网上针对这个题库资料较少且付费。索性自己写一个,算法不保证完全正确,仅供参考,题目有新有旧,随机更新。100分题目考点二叉树消消乐BFS200分题目考点好友推荐系统模拟、优化分配资源ID模拟、链表300分题目考点维修工动态规划......
  • 计算机毕业设计 | SpringBoot+vue精品在线试题库系统 线上考试平台(附源码+论文)
    1,绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场景......
  • HJ61~HJ70 华为机试题库
    HJ61 放苹果题目:https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf?tpId=37&tqId=21284&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&......
  • 基于SSM的试题库管理系统【附源码+文档】
    ......
  • HJ41~HJ50 华为机试题库
    HJ41 称砝码题目:https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c?tpId=37&tqId=21264&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&......
  • HJ11~HJ20 华为机试题库
    HJ11 数字颠倒题目:https://www.nowcoder.com/practice/ae809795fca34687a48b172186e3dafe?tpId=37&tqId=21234&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=......
  • HJ01~HJ10 华为机试题库
    HJ1 字符串最后一个单词的长度题目:https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&tqId=21224&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&am......
  • Oracle 19c OCP 082认证考试题库(第7题)- 2024年修正版
    【优技教育】Oracle19cOCP082题库(第7题)-2024年修正版考试科目:1Z0-082考试题量:90通过分数:60%考试时间:150min本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:https://www.cuug.com.cn/ocp/082kaoshitiku/38159072308.html第7题:7、C......