https://www.luogu.org/problemnew/show/2756
二分图网络流
鬼才去写网络流,输出方案?二分图匹配吧
网络流输出方案,枚举与汇点有流量的边,输出方案
#include<cstdio> #include<cstring> #include<algorithm> const int maxn = 10007; int m,n; inline int read() { int x=0,f=1;char c=getchar(); while(c<‘0‘||c>‘9‘) {if(c==‘-‘)f=-1;c=getchar();} while(c<=‘9‘&&c>=‘0‘) x=x*10+c-‘0‘,c=getchar(); return x*f; } struct Edge{ int v,next,flow; }edge[maxn];int num,head[maxn]; int link[maxn],used[maxn]; inline void add_edge(int u,int v) { edge[++num].v=v;edge[num].next=head[u];head[u]=num; } bool find(int x,int f) { for(int i=head[x];i;i=edge[i].next) { int v=edge[i].v; if(used[v]!=f) { used[v]=f; if(link[v]==-1||find(link[v],f)) { link[v]=x;return true; } } } return false; } int main() { m=read(),n=read(); for(int a,b;1101001;) { a=read(),b=read(); if(a<0&&b<0)break; add_edge(a,b); } int ans=0; std::memset(link,-1,sizeof link); for(int i=1;i<=m;++i) { if(find(i,i))ans++; } printf("%d\n",ans); for(int i=m+1;i<=n+m;++i) { if(link[i]>0) printf("%d %d\n",link[i],i); } return 0; }