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
| constexpr int N=305; char mp[N][N]; struct edge{int to,nxt,w;}e[N*N*8]; int head[N*N*2],cnt=1; inline void _add(int u,int v,int w){e[++cnt]=(edge){v,head[u],w};head[u]=cnt;} inline void add(int u,int v,int w){_add(u,v,w);_add(v,u,0);} int dep[N*N*2],cur[N*N*2],s,t; inline bool bfs() { memset(dep,-1,sizeof(dep));memcpy(cur,head,sizeof(head)); dep[s]=0;queue<int>q;q.push(s); while(!q.empty()) { int u=q.front();q.pop(); for(int i=head[u];i;i=e[i].nxt) { int v=e[i].to; if(~dep[v]||!e[i].w)continue; dep[v]=dep[u]+1;q.push(v); } } return ~dep[t]; } inline int dfs(int u,int fin) { if(!fin||u==t)return fin; int fout=0; for(int i=cur[u];i;i=e[i].nxt) { cur[u]=i;int v=e[i].to; if(dep[v]==dep[u]+1&&e[i].w) { int f=dfs(v,min(fin,e[i].w)); e[i].w-=f;e[i^1].w+=f;fin-=f;fout+=f; if(!fin)break; } } return fout; } inline int dinic() { int ans=0; while(bfs())ans+=dfs(s,1e9); return ans; } int prel[N][N],preu[N][N]; inline void work() { ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); int n,m;cin>>n>>m; for(int i=1;i<=n;i++)cin>>(mp[i]+1); int tot=3;s=1,t=2; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(mp[i][j]=='.'){if(prel[i][j-1])prel[i][j]=prel[i][j-1];else prel[i][j]=++tot,add(s,tot,1);} for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(mp[i][j]=='.'){if(preu[i-1][j])preu[i][j]=preu[i-1][j];else preu[i][j]=++tot,add(tot,t,1);} for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(mp[i][j]=='.')add(prel[i][j],preu[i][j],1); cout<<dinic(); }
CPP
|