【网络流24题】试题库(最大流)

题意

假设一个试题库中有 n n n 道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取 m m m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。

题解

每一道题为一个点,每一种类型的试卷为一个点。
源点向每一道题连容量为1的边,每一道题向其对应类型连容量的1的边,每一种类型的试卷向汇点连需要的个数为容量的边。
跑最大流即可。

代码

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int nmax = 1e6+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const ull p = 67;
const ull MOD = 1610612741;
int n, m;
struct Dinic {
    
    int head[nmax], cur[nmax], d[nmax];
    bool vis[nmax];
    int tot, n, m, s, t, front, tail;
    int qqq[nmax];
    struct edge {
    
        int nxt, to, w, cap, flow;
    } e[nmax<<1];
    void init(int n) {
    
        this->n = n;
        memset(head, -1, sizeof head);
        memset(cur, 0, sizeof cur);
        memset(e,0,sizeof e);
        this->tot = 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值