P2763 試題庫問題 最大流

2021-10-02 14:40:11 字數 2114 閱讀 2854

題意:給出n道題目,每道題目可以屬於很多個型別,現在出題需要每個型別有指定數量的題目,給出匹配方案

分析:這道題目其實建圖比較簡單,但是由於這題還讓給出最大流的乙個匹配方案,需要對陣列實現的鄰接表很熟悉,是我太菜了

做法

最左邊乙個超級源點,標號為0

連往n道題目,題目標號為[1,

n]

[1,n]

[1,n

],邊容量為1

題目連往各自所屬的型別,邊容量為1,型別標號為[n+

1,n+

k+1]

[n+1,n+k+1]

[n+1,n

+k+1

]型別連往最右邊的超級源點,標號為n+k+2,容量為各自指定的數量

dinic和sap都可,由於沒寫過dinic就試著寫一下

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define pb push_back

#define rep(x,a,b) for (int x=a;x<=b;x++)

#define repp(x,a,b) for (int x=a;x#define w(x) printf("%d\n",x)

#define ww(x) printf("%lld\n",x)

#define pi 3.14159265358979323846

#define mem(a,x) memset(a,x,sizeof a)

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

using namespace std;

const

int maxn=

2e4+7;

const

int inf=

1e9;

const ll inff=

1e18

;struct node

edge[maxn]

;int tol,k,n,x,q;

int head[maxn]

;void

init()

void

add(

int u,

int v,

int w,

int rw=0)

int q[maxn]

;int dep[maxn]

,cur[maxn]

,sta[maxn]

;bool bfs

(int sx,

int ex,

int n)}}

return false;

}int

dinic

(int sx,

int ex,

int n)

}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

main()

rep(i,

1,n)

add(

0,i,1,

0);}

if(dinic(0

,n+k+

1,n+k+2)

==sum)

rep(i,

1,k)

}else

printf

("no solution!\n");

}

P2763 試題庫問題 最大流

原題 題解 其實就是就是n個試題和k配對。建圖方法 s連i i n j連t j k 且邊的流量是a i 如題連i j就行了。跑一邊最大流,從k列舉,輸出答案。然而洛谷上要英文冒號。include define inf 0x7fffffff using namespace std const int ...

P2763 試題庫問題 網路流 最大流

傳送門 解題思路 比較簡單的網路流,建圖還是比較好想的。讓源點向試題連流量為1的邊,試題向所屬型別連流量為1的邊,型別向匯點連流量為需要此類試題的邊。直接跑最大流,輸出答案時找到那些滿流的邊所對的點。include include include include include using name...

題解 P2763 試題庫問題

題目描述 問題描述 假設乙個試題庫中有n道試題。每道試題都標明了所屬類別。同一道題可能有多個類別屬性。現要從題庫中抽取m 道題組成試卷。並要求試卷包含指定型別的試題。試設計乙個滿足要求的組卷演算法。程式設計任務 對於給定的組卷要求,計算滿足要求的組卷方案。輸入輸出格式 輸入格式 第1行有2個正整數k...