1 条题解

  • 0
    @ 2026-2-7 17:33:01
    #include<cstdio>
    #include<cstring>
    using  namespace  std;
    struct node
    {
        int  y,c,d,next,other;
    }a[110000];int  n,m,st,ed,nn,q,p,cost,len,last[2100];
    inline  int  zhuan(int  x,int  y){return  (x-1)*m+y;}
    void  ins(int  x,int y,int  c,int  d)
    {
        len++;
        a[len].y=y;a[len].c=c;a[len].d=d;
        a[len].next=last[x];last[x]=len;
        len++;
        a[len].y=x;a[len].c=0;a[len].d=-d;
        a[len].next=last[y];last[y]=len;
        a[len].other=len-1;a[len-1].other=len;
    }
    int  list[2100],head,tail,d[2100];
    bool  v[2100];
    bool  spfa()
    {
        memset(d,20,sizeof(d));d[ed]=0;
        head=1;tail=2;list[head]=ed;v[ed]=false;
        int  inf=d[st];
        while(head!=tail)
        {
            int  x=list[head];
            for(int  k=last[x];k;k=a[k].next)
            {
                int  y=a[k].y,kl=a[k].other;
                if(a[kl].c>0  &&  d[x]-a[k].d<d[y])
                {
                    d[y]=d[x]-a[k].d;
                    if(v[y]==true)
                    {
                        v[y]=false;
                        if(d[list[head+1]]>d[y])
                        {
                            int  all=head;
                            head--;if(head==0)head=nn;
                            list[head]=list[all];list[all]=y;
                        }
                        else
                        {
                            list[tail++]=y;if(tail==nn+1)tail=1;
                        }
                    }
                }
            }
            head++;if(head==nn+1)head=1;
            v[x]=true;
        }
        return  d[st]!=inf;
    }
    inline  int  mymin(int  x,int  y){return  x<y?x:y;}
    int  find(int  x,int  f)
    {
        v[x]=false;
        if(x==ed){v[x]=true;return  f;}
        int  ans=0,t=0;
        for(int  k=last[x];k;k=a[k].next)
        {
            int  y=a[k].y;
            if(a[k].c>0  &&  d[y]==d[x]-a[k].d  &&  ans<f  &&  v[y]==true)
            {
                ans+=t=find(y,mymin(a[k].c,f-ans));
                a[k].c-=t;a[a[k].other].c+=t;cost+=a[k].d*t;
            }
        }
        v[x]=true;
        return  ans;
    }
    int  main()
    {
        scanf("%d%d",&q,&p);
        scanf("%d%d",&n,&m);n++;m++;st=0;ed=n*m+1;nn=n*m+2;
        for(int  i=1;i<=n;i++)
        {
            for(int  j=1;j<m;j++)
            {
                int  x;scanf("%d",&x);
                int  xx=zhuan(i,j),yy=zhuan(i,j+1);
                ins(xx,yy,1,-x);ins(xx,yy,999999999,0);
            }
        }
        for(int  i=1;i<=m;i++)
        {
            for(int  j=1;j<n;j++)
            {
                int  x;scanf("%d",&x);
                int  xx=zhuan(j,i),yy=zhuan(j+1,i);
                ins(xx,yy,1,-x);ins(xx,yy,999999999,0);
            }
        }
        for(int i=1;i<=q;i++)
        {
            int  t,x,y;scanf("%d%d%d",&t,&x,&y);
            ins(st,zhuan(x+1,y+1),t,0);
        }
        for(int i=1;i<=p;i++)
        {
            int  t,x,y;scanf("%d%d%d",&t,&x,&y);
            ins(zhuan(x+1,y+1),ed,t,0);
        }
        int  ans=0;
        memset(v,true,sizeof(v));
        while(spfa())
        {
            ans+=find(st,999999999);
        }
        printf("%d\n",-cost);
        return  0;
    }
    
    • 1

    信息

    ID
    956
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    8
    已通过
    5
    上传者