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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<stack> #include<cmath> #include<set> #include<bitset> #include<assert.h> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,0,sizeof(a)) #define ll long long #define eps 1e-8 #define succ(x) (1<<x) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid (x+y>>1) #define NM 105 #define nm 200005 #define pi 3.1415926535897931 #define mp(x,y) make_pair(x,y) using namespace std; const int inf=1e9; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; }
int n,_x,_y,_ans; bool a[NM][NM]; bool _v[NM],__v[NM],V[NM]; int v[NM],match[NM],ans,_match[NM]; bool dfs(int x){ inc(j,1,n)if(V[j]&&a[x][j]&&v[j]!=_x){ v[j]=_x; if(!match[j]||dfs(match[j])){match[j]=x;return true;} } return false; } void _dfs(int x){ __v[x]++; inc(j,1,n)if(a[x][j]&&!_v[j]){ _v[j]++; _dfs(match[j]); } }
int main(){ n=read();int _=read();while(_--){ _x=read();_y=read();a[_x][_y]++; } inc(k,1,n)inc(i,1,n)if(i!=k&&a[i][k])inc(j,1,n)if(i!=j&&k!=j&&a[k][j])a[i][j]=true; ans=n; inc(i,1,n)V[i]=true; inc(i,1,n)if(dfs(_x=i))ans--; inc(i,1,n)_match[match[i]]=i; printf("%d\n",ans); _ans=ans; inc(i,1,n)if(!_match[i])_dfs(i); inc(i,1,n)if(__v[i]&&!_v[i])putchar('1');else putchar('0');putchar('\n'); inc(k,1,n){ inc(i,1,n)if(a[i][k]||a[k][i])V[i]=false;else V[i]=true; V[k]=false; ans=0; inc(i,1,n)if(V[i])ans++; mem(v);mem(match); inc(i,1,n)if(V[i]&&dfs(_x=i))ans--; if(ans+1==_ans)putchar('1');else putchar('0'); } putchar('\n'); return 0; }
|