1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include<iostream> #include<vector> #include<cstring> #define INF 0x3f3f3f3f #define N 330 using namespace std; int n,m,i,j,Found,flow,al,t,cnt,x,y; int l[N][N]; int gap[N],gaps[N],go[N],bh[N]; inline int (){ int p=0; char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') p=p*10+c-48,c=getchar(); return p; } inline int min(int a,int b){return (a<b)?a:b;} inline void Sap(int x){ int i=0,F=al,mingap=cnt-1; if (x==cnt) {flow+=al; Found=1; return;} for (i=1;i<=cnt;i++) if (l[x][i]){ if (gap[i]+1==gap[x]){ al=min(al,l[x][i]); Sap(i); if (gap[1]>=cnt) return; if (Found) break; al=F; } mingap=min(mingap,gap[i]); } if (!Found){ gaps[gap[x]]--; if (!gaps[gap[x]]) gap[1]=cnt; gaps[gap[x]=mingap+1]++; } else l[x][i]-=al,l[i][x]+=al; } int main(){ n=read(); m=read(); cnt=n*2+2; for (i=1;i<=n;i++) l[1][1+i]=1; for (i=1;i<=n;i++) l[1+n+i][cnt]=1; for (i=1;i<=m;i++){ x=read(); y=read(); l[x+1][1+n+y]=1; } gaps[0]=cnt; while (gap[1]<cnt){ Found=0; al=INF; Sap(1); } cnt=0; for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (l[1+n+j][1+i]) go[i]=j; for (i=1;i<=n;i++) if (!bh[i]){ t=i; cnt++; while (t) {bh[t]=1; printf("%d ",t); t=go[t];} putchar(10); } printf("%dn",cnt); return 0; }
|
近期评论