题意
假设一个试题库中有 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;
}