萌新求助Dinic
查看原帖
萌新求助Dinic
85593
dying楼主2021/11/5 19:27
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define getchar() READ.getc()
#define putchar(x) print.putc(x)
#define puts(s) my_puts(s)
FILE*input=stdin;
FILE*output=stdout;
struct in{
    char buf[1<<20],*p,*end;
    char getc(){if(p==end)end=buf+fread(buf,1,1<<20,input),p=buf;return p==end?EOF:*(p++);}
    int operator()(){
        int x=0,f=0,ch=getc();
        while(!isdigit(ch)&&ch!=EOF){if(ch=='-')f=1;ch=getc();}
        while(isdigit(ch))x=x*10+(ch^48),ch=getc();
        return f?-x:x;
    }
}READ;
struct out{
    char buf[1<<20],*p=buf,*end=buf+(1<<20);
    void putc(char c){if(p==end)fwrite(buf,1,1<<20,output),p=buf;*(p++)=c;}
    void operator()(long long x){
        if(x<0)x=-x,putc('-');
        if(x>=10)(*this)(x/10);
        putc(x%10^48);
    }
    ~out(){fwrite(buf,1,p-buf,output),p=0;}
}print;
void my_puts(const char*s){for(int i=0;s[i]!='\0';i++)putchar(s[i]);putchar('\n');}

int n=READ(),m=READ(),s,t=n*m+1;

int h[10010],e[100010],w[100010],ne[100010],idx;
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int mp[110][110];

#define bh(a,b) (((a)-1)*n+(b))

int dep[10010];
bool bfs(){
    memset(dep,0,sizeof(dep));
    queue<int>q;
    dep[s]=1,q.push(s);
    while(q.size()){
        int u=q.front();q.pop();
        for(int i=h[u];~i;i=ne[i]){
            if(w[i]&&!dep[e[i]]){
                dep[e[i]]=dep[u]+1;
                q.push(e[i]);
            }
        }
    }
    return dep[t];
}

int dfs(int d,int v){
    if(d==t)return v;
    int out=0;
    for(int i=h[d];~i;i=ne[i]){
        if(w[i]&&dep[e[i]]==dep[d]+1){
            int res=dfs(e[i],min(w[i],v));
            out+=res,v-=res;
            w[i]-=res,w[i^1]+=res;
        }
        if(!v)break;
    }
    if(!out)dep[d]=0;
    return out;
}

signed main(){
    memset(h,-1,sizeof(h));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            mp[i][j]=READ();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i>1&&!(mp[i-1][j]==mp[i][j]&&mp[i][j]))add(bh(i,j),bh(i-1,j),1),add(bh(i-1,j),bh(i,j),1);
            if(j>1&&!(mp[i][j-1]==mp[i][j]&&mp[i][j]))add(bh(i,j),bh(i,j-1),1),add(bh(i,j-1),bh(i,j),1);
            if(mp[i][j]==1)add(s,bh(i,j),1e8),add(bh(i,j),s,0);
            if(mp[i][j]==2)add(bh(i,j),t,1e8),add(t,bh(i,j),0);
        }
    }
    int ans=0;
    while(bfs())ans+=dfs(s,1e18);
    print(ans),puts("");
    return ~0^~0;
}

只有50pts 我真的是萌新,什么当前弧优化预留推进之类的都不会,不像几个帖子下的cz

2021/11/5 19:27
加载中...