網路流24題7 試題庫問題

2021-07-27 19:08:13 字數 1556 閱讀 3712

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

第1行有2個正整數n和k (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!」。

3 15

3 3 4

2 1 2

1 3

1 3

1 3

1 3

3 1 2 3

2 2 3

2 1 3

1 2

1 2

2 1 2

2 1 3

2 1 2

1 1

3 1 2 3

1: 1 6 8

2: 7 9 10

3: 2 3 4 5

由於spj問題,將資料改為了判定能否找到組卷方式。

將每道題目作為x集合中的點,每個類別作為y集合中的點。

1.從s向xi連一條容量為1的邊。

2.從yi向t連一條容量為該類別所需題數的邊。

3.若試題i屬於類別j,xi向yj連一條容量為1的邊。

最大流等於需要的總題目數既可以,滿流邊

,yj>

代表試題i作為類別j的試題選入卷子中。

考慮正確性,x,y集合之間的邊容量全部是1,保證兩個點只能匹配一次,源匯的連邊限制了每個點匹配的個數。求出網路最大流,如果流量等於x集合所有點與s邊容量之和,那麼則說明x集合每個點都有完備的多重匹配。

#include

#include

#include

using namespace std;

const int n = 1000 + 10, m = 100000 + 10, inf = 0x3f3f3f3f;

struct edgeedg[m];

int n, k, tot, sum;

int hd[n], nxt[m];

ints, t;

int d[n], q[n], vis[n], dfn;

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

bool bfs()

}return vis[t] == dfn;

}int dfs(int

x, int a)

}return flow;

}void init()

int p, v;

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

}}void work()

int main()

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