Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <bitset>
- #define N 105
- using namespace std;
- int n,m;
- int a[N][N], cod[N][N], st[N*N], dr[N*N];
- int dx[]={-1,1,0,0};
- int dy[]={0,0,-1,1};
- vector<int> g[N*N];
- bitset<N*N> viz;
- bool Inside(int i, int j)
- {
- return i>=1 && i<=n && j>=1&& j<=m;
- }
- bool Cupleaza(int k)
- {
- if(viz[k]==1) return 0;
- viz[k]=1;
- for(int i:g[k])
- {
- if(dr[i]==0) { st[k]=i,dr[i]=k;return 1;}
- }
- for(int i:g[k])
- {
- if(Cupleaza(dr[i]))
- {
- st[k]=i, dr[i]=k;
- return 1;
- }
- }
- return 0;
- }
- int main()
- {
- cin>>n>>m;
- int i,j;
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- cin>>a[i][j];
- int cnt=0;
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- {
- cnt+=a[i][j];
- cod[i][j]=cnt;
- }
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- {
- if(a[i][j]==0) continue;
- for(int d=0;d<4;d++)
- {
- int l=i+dx[d], c=j+dy[d];
- if(Inside(l,c)&& a[l][c]==1)
- {
- if((i+j)&1)g[cod[i][j]].push_back(cod[l][c]);
- }
- }
- }
- bool gata=0;
- int res=0;
- while(!gata)
- {
- gata=1;
- viz.reset();
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- if(a[i][j]==1 && st[cod[i][j]]==0 && Cupleaza(cod[i][j]))
- {
- res++;
- gata=0;
- }
- }
- cout<<res;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement