luogu P2763 試題庫問題 最大流

2021-09-11 17:51:06 字數 1553 閱讀 4546

«問題描述:

假設乙個試題庫中有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 ...