题意:
n<=100,要求输出方案
思路:准备把没刷的24题从头搞一遍
输出方案的话就在增广的时候记一下另一端的编号就好
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef vector<int> VI; 10 typedef vector<PII> VII; 11 //typedef pair<ll,ll>P; 12 #define N 300010 13 #define M 200010 14 #define INF 1e9 15 #define fi first 16 #define se second 17 #define MP make_pair 18 #define pb push_back 19 #define pi acos(-1) 20 #define mem(a,b) memset(a,b,sizeof(a)) 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 23 #define lowbit(x) x&(-x) 24 #define Rand (rand()*(1<<16)+rand()) 25 #define id(x) ((x)<=B?(x):m-n/(x)+1) 26 #define ls p<<1 27 #define rs p<<1|1 28 29 const ll MOD=1e9+7,inv2=(MOD+1)/2; 30 double eps=1e-6; 31 int dx[4]={-1,1,0,0}; 32 int dy[4]={0,0,-1,1}; 33 34 int head[N],vet[N],len[N],nxt[N],dis[N],gap[N],x[N],y[N],f[N],s,S,T,tot; 35 36 int read() 37 { 38 int v=0,f=1; 39 char c=getchar(); 40 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 41 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 42 return v*f; 43 } 44 45 void add(int a,int b,int c) 46 { 47 nxt[++tot]=head[a]; 48 vet[tot]=b; 49 len[tot]=c; 50 head[a]=tot; 51 52 nxt[++tot]=head[b]; 53 vet[tot]=a; 54 len[tot]=0; 55 head[b]=tot; 56 } 57 58 int dfs(int u,int aug) 59 { 60 if(u==T) return aug; 61 int e=head[u],val=s-1,flow=0; 62 while(e) 63 { 64 int v=vet[e]; 65 if(len[e]) 66 { 67 if(dis[u]==dis[v]+1) 68 { 69 int t=dfs(v,min(len[e],aug-flow)); 70 if(t) f[u]=v; 71 len[e]-=t; 72 len[e^1]+=t; 73 flow+=t; 74 if(dis[S]>=s) return flow; 75 if(aug==flow) break; 76 } 77 val=min(val,dis[v]); 78 } 79 e=nxt[e]; 80 } 81 if(!flow) 82 { 83 gap[dis[u]]--; 84 if(!gap[dis[u]]) dis[S]=s; 85 dis[u]=val+1; 86 gap[dis[u]]++; 87 } 88 return flow; 89 } 90 91 int maxflow() 92 { 93 rep(i,0,s) gap[i]=0; 94 rep(i,1,s) dis[i]=0; 95 gap[0]=s; 96 int ans=0; 97 while(dis[S]<s) ans+=dfs(S,INF); 98 return ans; 99 } 100 101 int main() 102 { 103 //freopen("1.in","r",stdin); 104 int m=read(),n=read(); 105 rep(i,1,n) head[i]=0; 106 tot=1; 107 int l=1; 108 while(1) 109 { 110 l++; 111 x[l]=read(),y[l]=read(); 112 if(x[l]==-1) break; 113 add(x[l],y[l],1); 114 } 115 s=n+m; 116 S=++s; 117 T=++s; 118 rep(i,1,m) add(S,i,1); 119 rep(i,m+1,n) add(i,T,1); 120 int ans=maxflow(); 121 if(ans==0) 122 { 123 printf("No Solution! "); 124 return 0; 125 } 126 printf("%d ",ans); 127 rep(i,1,m) 128 if(f[i]) printf("%d %d ",i,f[i]); 129 130 return 0; 131 }