網路流24題 試題庫問題

2022-05-15 09:50:38 字數 1673 閱讀 7555

時空限制1000ms / 128mb

«問題描述:

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

輸入樣例: 

3 15

3 3 4

2 1 2

1 31 3

1 31 3

3 1 2 3

2 2 3

2 1 3

1 21 2

2 1 2

2 1 3

2 1 2

1 13 1 2 3

輸出樣例: 

1: 1 6 8

2: 7 9 10

3: 2 3 4 5

最大流。

雖然點數很多,但是每條邊的流量很小,這樣增廣次數也不會很多,用dinic可以過。(而且dinic也很難達到上界複雜度,通常一千左右的點,就算是完全圖,如果邊權很小的話,dinic也跑的飛快)。

#include#define n 1035

using

namespace

std;

typedef

struct

ss;ss edg[n*n];

vector

edges[n];

int now_edges=0

;void addedge(int u,int v,long

long

flow)

; edges[v].push_back(now_edges);

edg[now_edges++]=(ss)

;}int

s,t,current[n];

int dis[n]= ;

intbfs()}}

return

dis[t];

}long

long dfs(int now,long

long

maxflow)}}

return0;

}long

long

dinic()

return

ans;

}int

main()

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

addedge(s,i,1);

}long

long ans=dinic();

if(ans==tot)

}else

printf(

"no solution!\n");

return0;

}

view code

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