萌新刚学OI,TLE求助
查看原帖
萌新刚学OI,TLE求助
339846
RuntimeErr楼主2021/8/10 21:15

RT,全T

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
template <typename T>
inline void read(T& r) {
    r=0;bool w=0; 
    char ch=getchar();
    while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
    while(ch>='0'&&ch<='9') r=(r<<3)+(r<<1)+(ch^48), ch=getchar();
    r=w?-r:r;
}

const int N=1010,M=1e6+10,inf=0x7ffffff;
#define id(i,j) (i-1)*m+j

int n,m,s,t,maxflow,col,row;
int h[N],e[M],ne[M],w[M],idx=1;
int dep[N],cur[N];
char g[51][51];int c[51][51],r[51][51];
queue<int>q;

int a[M],b[M],tot;

inline void add(int a,int b){
    e[++idx]=b;ne[idx]=h[a];w[idx]=1;h[a]=idx;
    e[++idx]=a;ne[idx]=h[b];w[idx]=0;h[b]=idx;
}

bool bfs(){
    for(int i=1;i<=t;++i)dep[i]=0,cur[i]=h[i];
    dep[s]=1;q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=h[u],v;i;i=ne[i]){
            v=e[i];
            if(w[i]&&!dep[v]){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    return dep[t];
}
int dinic(int u,int in){
    if(u==t||!in)return in;
    int out=0;
    for(int i=cur[u],v;i;i=ne[i]){
        cur[u]=i;v=e[i];
        if(w[i]&&dep[v]==dep[u]+1){
            int res=dinic(v,min(in,w[i]));
            in-=res;out+=res;
            w[i]-=res;w[i^1]+=res;
        }
    }
    if(!out)dep[u]=-1;
    return out;
}

void debug(){
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            if(g[i][j]!='#')printf("%d",r[i][j]);
            else printf("#");
        }
        puts("");
    }puts("");
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            if(g[i][j]!='#')printf("%d",c[i][j]);
            else printf("#");
        }
        puts("");
    }
}

int main(){
    #ifdef LOCAL
        freopen("std.in","r",stdin);
        freopen("my.out","w",stdout);
    #endif
    read(n);read(m);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            scanf(" %c",&g[i][j]);
        }
        g[0][i]=g[i][0]=g[n+1][i]=g[i][m+1]='#';
    }
    for(int i=1;i<=n;++i){//i->行, i+n->列, link(i,j+n) 表示在 (i,j) 放炸弹
        for(int j=1;j<=m;++j){
            if(g[i][j]=='#')continue;
            c[i][j]=g[i-1][j]=='#'?++col:c[i-1][j];
            r[i][j]=g[i][j-1]=='#'?++row:r[i][j-1];
            if(g[i][j]=='*')a[++tot]=r[i][j],b[tot]=c[i][j];
        }
    }
    s=row+col+1,t=s+1;
    for(int i=1;i<=row;++i)add(s,i);
    for(int i=1;i<=col;++i)add(i+row,t);
    for(int i=1;i<=tot;++i)add(a[i],b[i]+row);
    while(bfs())maxflow+=dinic(s,inf);
    printf("%d\n",maxflow);
    // debug();
    return 0;
}
2021/8/10 21:15
加载中...