«問題描述:
假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。
«程式設計任務:
對於給定的組卷要求,計算滿足要求的組卷方案。
建乙個源點,向所有的試題連邊,容量為1,試題向其所屬的類連邊,容量1,所有的類向匯點連線容量為其需求量的邊,最後跑一下最大流,若最大流量等於m則有解,遍歷所有試題並將其加入所屬的類的陣列中,再針對試題類輸出即可.反之則沒有答案
// luogu-judger-enable-o2
#include
using
namespace std;
const
int maxn=
2005
;const
int maxm=
4e6+5;
const
int inf=
0x3f3f3f3f
;struct edgeedge[maxm]
;int tol;
int head[maxn]
;void
init()
void
addedge
(int u,
int v,
int w,
int rw=0)
int q[maxn]
;int dep[maxn]
,cur[maxn]
,sta[maxn]
;bool
bfs(
int s,
int t,
int n)}}
return
false;}
intdinic
(int s,
int t,
int n)
maxflow+
=tp;
for(
int i=tail-
1;i>=
0;i--
) u=edge[sta[tail]^1
].to;
}else
if(cur[u]!=-
1&&edge[cur[u]
].cap>edge[cur[u]
].flow&&dep[u]+1
==dep[edge[cur[u]
].to]
)else}}
return maxflow;
}int cnt[25]
;vector<
int> ans[25]
;int
main()
addedge
(s,i,1)
;}int tolflow=
dinic
(s,t,k+n+5)
;if(tolflow==m)}}
for(
int i=
1;i<=k;i++)}
else
printf
("no solution!\n");
}
luoguP2763 試題庫問題(最大流)
傳送門 每個類別和它所有的試題連一條權值為1的邊。增加乙個超級源點s,s和每個類別連一條權值為選當前類別數量的邊。增加乙個超級匯點t,每個試題和t連一條權值為1的邊。求最大流即可。1 include 2 include 3 include 4 include 5 define min x,y x y...
題解 P2763 試題庫問題
題目描述 問題描述 假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。程式設計任務 對於給定的組卷要求,計算滿足要求的組卷方案。輸入輸出格式 輸入格式 第1行有2個正整數k...
洛谷 P2763 試題庫問題
問題描述 假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。程式設計任務 對於給定的組卷要求,計算滿足要求的組卷方案。輸入格式 第1行有2個正整數k和n 2 k 20,k ...