網路流24題07 試題庫問題

2021-08-15 20:31:17 字數 1347 閱讀 8948

假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。

對於給定的組卷要求,計算滿足要求的組卷方案。

第1行有2個正整數k和n (2 <=k<= 20, k<=n<= 1000)

k 表示題庫中試題型別總數,n 表示題庫中試題總數。第2 行有k 個正整數,第i 個正整數表示要選出的型別i的題數。這k個數相加就是要選出的總題數m。接下來的n行給出了題庫中每個試題的型別資訊。每行的第1 個正整數p表明該題可以屬於p類,接著的p個數是該題所屬的型別號。

第i 行輸出 「i:」後接型別i的題號。如果有多個滿足要求的方案,只要輸出1個方案。如果問題無解,則輸出「no solution!」。

建立乙個源s,把s向每個試題連一條權值為1的邊

建立乙個匯t,把每種試題型別向t連一條權值為c[i]的邊(c[i]為這種型別試題的數目)

將每個試題向所屬的每個試題型別連一條權值為1的邊

跑一邊最大流匹配一下

如果最大流!=m則無解,否則輸出答案

洛谷上可以測

#include

#include

#include

#include

using

namespace

std;

#define maxn 1000010

int n,k,s,t;

const

int inf=1e9+7;

inline

int read()

while(ch>='0'&&ch<='9')

return ret;

}struct edgee[maxn];

int dis[maxn];

int ecnt=0,head[maxn];

void addedge(int u,int v,int w)

void addedge(int u,int v,int w)

bool bfs()

}return dis[t]!=inf;

}int dfs(int x,int nar)

if(!used) dis[x]=-1;

return used;

}int dinic()

int w[maxn];

int main()

for(int i=1;i<=n;++i)

}if(dinic()==sum)

}puts("");}}

else

printf("no solution!\n");

return

0;}

網路流24題 試題庫問題

網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這道題的模型很顯然,源點向每個試卷連線一條容量為1的邊,每個試卷向對應的型別連線一條容量為一的邊,每個型別向匯點連線一條容量為需要數量的邊,跑一邊最大流即可。include inclu...

網路流24題 試題庫問題

傳送門 這個題好像比較水。每個種類向匯點連容量為所需求的數量的邊 然後每個試題向可以選的種類連容量為1的邊 再從源點向每個試題連容量為1的邊,然後dinic 過程中記錄一下轉移的目標節點,然後輸出路徑就好了 判無解不用我說了吧。include include include include incl...

網路流24題 試題庫問題

有 k k 種型別和 n role presentation n n個題目,每個題目會適應部分型別,一種型別可能需要多種題,一道題可能多種型別都需要,但一道題只能滿足一種型別,現要求出滿足出完所有型別的題目的方案 網路流擅長於解決各種有要求的匹配,顯然這道題是有條件的匹配,可以用最大流來解決。首先建...