刚学1普朗克时间ISAP,T8个点求调
  • 板块P4313 文理分科
  • 楼主wxh666
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/2 15:07
  • 上次更新2023/11/3 06:21:36
查看原帖
刚学1普朗克时间ISAP,T8个点求调
342494
wxh666楼主2023/8/2 15:07

https://www.luogu.com.cn/record/118177298

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace lsq {
    typedef int lsqxx;
    struct lq {
        struct lqbz {
            lsqxx v,w,nxt;
        } e[10000005];
        lsqxx h[10000005],cnt=1;
        inline void add(lsqxx u,lsqxx v,lsqxx w=1) {
            e[++cnt].v=v;
            e[cnt].w=w;
            e[cnt].nxt=h[u];
            h[u]=cnt;
        }
    #define F(z,u) for(int j=z.h[u],v=z.e[j].v,w=z.e[j].w;j;j=z.e[j].nxt,v=z.e[j].v,w=z.e[j].w)
    }q;
};
using namespace lsq;
int n,m,s=0,t=1,cnt;
int art[505][505],science[505][505];
int same_art[505][505],same_science[505][505];
int d[10000005];
int dcnt=0;
void BFS()
{
    memset(d,-1,sizeof(d));
    queue<int>r;
    r.push(t);
    d[t]=0;
    while(!r.empty())
    {
        int cht=r.front();r.pop();
        F(q,cht)
        {
            if(d[v]!=-1) continue;
            if(w!=0) continue;
            d[v]=d[cht]+1;
            r.push(v);
        }
    }
}
int dfs(int u=s,int in=INT_MAX)
{
    // cout<<u<<endl;
    if(u==t) {return in;}
    int out=0;
    F(q,u)
    {
        // cout<<v<<endl;
        if(d[u]>d[v]&&w)
        {
            int nt=dfs(v,min(w,in));
            in-=nt;out+=nt;
            q.e[j].w-=nt;q.e[j^1].w+=nt;
            if(!in) return out;
        }
    }
    ++d[u];
    return out;
}
int ISAP()
{
    int ans=0;
    BFS();
    while(d[s]<dcnt) ans+=dfs();
    return ans;
}
int two_one(int x,int y)
{
    return (x-1)*m+y+1;
}
int ans=0;
signed main()
{
    cin>>n>>m;
    dcnt=n*m*2+2;
    cnt=n*m+5;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            int l=scanf("%lld",&art[i][j]);
            ans+=art[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            int l=scanf("%lld",&science[i][j]);
            ans+=science[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            int l=scanf("%lld",&same_art[i][j]);
            ans+=same_art[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            int l=scanf("%lld",&same_science[i][j]);
            ans+=same_science[i][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            q.add(s,two_one(i,j),art[i][j]);
            q.add(two_one(i,j),s,0);
            q.add(two_one(i,j),t,science[i][j]);
            q.add(t,two_one(i,j),0);
            //IF NOW IS 80

            int dx[5]={0,1,0,-1,0};
            int dy[5]={0,0,1,0,-1};
            q.add(s,++cnt,same_art[i][j]);
            q.add(cnt,s,0);
            q.add(cnt,two_one(i,j),INT_MAX);
            q.add(two_one(i,j),cnt,0);
            for(int k=1;k<=4;k++)
            {
                int xx=i+dx[k],yy=j+dy[k];
                if(xx<1||yy<1||xx>n||yy>m) continue;
                q.add(cnt,two_one(xx,yy),INT_MAX);
                q.add(two_one(xx,yy),cnt,0);
            }

            q.add(++cnt,t,same_science[i][j]);
            q.add(t,cnt,0);
            q.add(two_one(i,j),cnt,INT_MAX);
            q.add(cnt,two_one(i,j),0);
            for(int k=1;k<=4;k++)
            {
                int xx=i+dx[k],yy=j+dy[k];
                if(xx<1||yy<1||xx>n||yy>m) continue;
                q.add(two_one(xx,yy),cnt,INT_MAX);
                q.add(cnt,two_one(xx,yy),0);
            }
        }
    cout<<ans-ISAP()<<endl;
    return 0;
}
2023/8/2 15:07
加载中...