Yeasion needs help。。。。。。

P1231 教辅的组成

## TQL
by MorsLin @ 2018-05-23 20:22:24


```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<queue> #define MAXN 100010 using namespace std; int n1,n2,n3,s,t; struct edge { int v; int next; int cap; }edge[MAXN]; int dist[MAXN],head[MAXN],cur[MAXN]; int total=0; void add(int f,int t,int l) { edge[total].v=t; edge[total].cap=l; edge[total].next=head[f]; head[f]=total++; edge[total].v=f; edge[total].cap=0; edge[total].next=head[t]; head[t]=total++; } bool BFS() { memset(dist,-1,sizeof(dist)); queue<int> q; while(!q.empty()) q.pop(); q.push(s); dist[s]=0; while(!q.empty()) { int cnt=q.front(); q.pop(); for(int i=head[cnt];i!=-1;i=edge[i].next) { if(dist[edge[i].v]==-1) if(edge[i].cap>0) { dist[edge[i].v]=dist[cnt]+1; q.push(edge[i].v); if(edge[i].v==t) break; } } } return dist[t]!=-1; } int DFS(int cnt,int cap) { if(cnt==t||cap==0) return cap; int res=0,f; for(int i=head[cnt];i!=-1;i=edge[i].next) { if(dist[edge[i].v]==dist[cnt]+1) if(edge[i].cap>0) if((f=DFS(edge[i].v,min(cap-res,edge[i].cap)))>0) { edge[i].cap-=f; edge[i^1].cap+=f; res+=f; if(cap==res) return cap; } } if(res<cap) dist[cnt]=-1; return res; } int dinic() { int ans=0; while(BFS()) { //for(int i=0;i<=n1*2+n2+n3+1;i++) // cur[i]=head[i]; ans+=DFS(s,MAXN); } return ans; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d%d",&n1,&n2,&n3); s=0;t=n2+n1*2+n3+1; int m1,m2,x,y; for(int i=1;i<=n2;i++) add(s,i,1); scanf("%d",&m1); for(int i=1;i<=m1;i++) { scanf("%d%d",&x,&y); add(y,x+n2,1); } for(int i=1;i<=n1;i++) add(i+n2,i+n1+n2,1); scanf("%d",&m2); for(int i=1;i<=m2;i++) { scanf("%d%d",&x,&y); add(x+n2+n1,y+n2+n1*2,1); } for(int i=1;i<=n3;i++) add(i+n1*2+n2,t,1); int anss=dinic(); printf("%d",anss); return 0; } ```
by MorsLin @ 2018-05-23 21:35:36


|