[luogu1231] 教辅的组成
Posted neworld2002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luogu1231] 教辅的组成相关的知识,希望对你有一定的参考价值。
这题有个坑点(好吧是我第一次做这类题没有感觉)。就是一本书只能用一次,也就是这个点带有点容量,所以需要进行拆点。
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 20005
#define INF 2147483647
struct edge {
int v,next,f;
}G[200000];
int head[MAXN<<2],cur[MAXN<<2];
int d[MAXN<<2];
int N1,N2,N3,tot = -1;
int S,T,ans = 0;
int M1,M2;
inline void add(int u,int v,int cap) {
G[++tot].v = v; G[tot].f = cap; G[tot].next = head[u]; head[u] = tot;
}
inline bool bfs() {
std::memset(d,0,sizeof(d));
std::queue <int> q;
d[S] = 1; q.push(S);
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i=head[u];i!=-1;i=G[i].next) {
int v = G[i].v;
if(d[v]||!G[i].f) continue;
d[v] = d[u] + 1; q.push(v);
}
}
return d[T];
}
int dinic(int u,int a) {
if(u==T) return a;
int temp,flow = 0;
for(int& i=cur[u];i!=-1;i=G[i].next) {
int v = G[i].v;
if(d[v]==d[u]+1&&G[i].f) {
temp = dinic(v,std::min(a,G[i].f));
flow += temp; a -= temp;
G[i].f -= temp; G[i^1].f += temp;
if(!a) return flow;
}
}
return flow;
}
int main() {
scanf("%d%d%d",&N1,&N2,&N3);
std::memset(head,-1,sizeof(head));
S = N1 + N1 + N2 + N3 + 1; T = N1 + N1 + N2 + N3 + 2;
for(int i=1;i<=N2;++i) add(S,N1*2+i,1),add(N1*2+i,S,0);
for(int i=1;i<=N1;++i) add(i,N1+i,1),add(N1+i,i,0);
for(int i=1;i<=N3;++i) add(N1*2+N2+i,T,1),add(T,N1*2+N2+i,0);
int u,v;
scanf("%d",&M1);
for(int i=1;i<=M1;++i) {
scanf("%d%d",&u,&v);
add(N1*2+v,u,1); add(u,N1*2+v,0);
}
scanf("%d",&M2);
for(int i=1;i<=M2;++i) {
scanf("%d%d",&u,&v);
add(N1+u,N1*2+N2+v,1); add(N1*2+N2+v,N1+u,0);
}
int maxflow = 0;
while(bfs()) {
for(int i=1;i<=T;++i) cur[i] = head[i];
maxflow += dinic(S,INF);
}
printf("%d",maxflow);
return 0;
}
以上是关于[luogu1231] 教辅的组成的主要内容,如果未能解决你的问题,请参考以下文章