luogu2756飞行员配对问题

来源:互联网 发布:mac系统软件下载 编辑:程序博客网 时间:2024/05/17 03:40

题目

  https://www.luogu.org/problem/show?pid=2756

题解

  水题最大流。

代码

//最大流#include <cstdio>#include <algorithm>#include <cstring>#define maxn 1000000#define inf 0x3f3f3f3fusing namespace std;int N, M, head[maxn], next[maxn], to[maxn], c[maxn], S, T, tot=1, d[maxn], num[maxn], last[maxn],Exit;void adde(int a, int b, int cc){to[++tot]=b;c[tot]=cc;next[tot]=head[a];head[a]=tot;}void adde2(int a, int b, int cc){adde(a,b,cc);adde(b,a,0);}int isap(int pos, int in){int flow=0, t;if(pos==T)return in;for(int &p=last[pos];p;p=next[p])if(c[p] and d[to[p]]+1==d[pos]){flow+= t=isap(to[p],min(in-flow,c[p]));c[p]-=t, c[p xor 1]+=t;if(Exit or in==flow)return flow;}Exit=--num[d[pos]]==1;++num[++d[pos]];last[pos]=head[pos];return flow;}void build(){int i, x, y;scanf("%d%d",&M,&N);S=N+1, T=S+1;for(i=1;i<=M;i++)adde2(S,i,1);for(i=M+1;i<=N;i++)adde2(i,T,1);for(scanf("%d%d",&x,&y);x!=-1;adde2(x,y,1),scanf("%d%d",&x,&y));}void show(){int i, p;for(i=1;i<=M;i++)for(p=head[i];p;p=next[p])if(c[p]==0 and to[p]!=S)printf("%d %d\n",i,to[p]);}int main(){int flow;build();for(flow=0;!Exit;flow+=isap(S,inf));if(flow==0)printf("No Solution!\n");else{printf("%d\n",flow);show();}return 0;}


0 0
原创粉丝点击