題意:給出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...