2 条题解

  • 0
    @ 2026-3-27 13:11:31
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e6+10,inf=1e18;
    int n,m,st,ed,mn;
    struct node{int to,w,c,nxt;}e[N];
    int head[N],cur[N],len;
    void add(int x,int y,int w,int c)
    {
    	e[++len]={y,w,c,head[x]};head[x]=len;
    	e[++len]={x,0,-c,head[y]};head[y]=len;
    }
    int d[N];
    bool vis[N],inq[N];
    bool spfa()
    {
    	for(int i=1;i<=ed;i++)d[i]=inf;
    	queue<int>q;
    	q.push(st);
    	d[st]=0;
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		inq[x]=0;
    		for(int i=head[x];i;i=e[i].nxt)
    		{
    			int y=e[i].to;
    			if(e[i].w&&d[y]>d[x]+e[i].c)
    			{
    				d[y]=d[x]+e[i].c;
    				if(!inq[y])q.push(y),inq[y]=1;
    			}
    		}
    	}
    	return d[ed]!=inf;
    }
    int dfs(int x,int res)
    {
    	if(x==ed||!res)return res;
    	vis[x]=1;
    	int ans=0;
    	for(int i=cur[x];i;i=e[i].nxt)
    	{
    		int y=e[i].to;
    		cur[x]=i;
    		if(!vis[y]&&e[i].w&&d[y]==d[x]+e[i].c)
    		{
    			int sum=dfs(y,min(res-ans,e[i].w));
    			e[i].w-=sum;
    			e[i^1].w+=sum;
    			mn+=sum*e[i].c;
    			ans+=sum;
    			if(ans==res)break;
    		}
    	}
    	vis[x]=0;
    	return ans;
    }
    int dinic()
    {
    	int ans=0,flow;
    	while(spfa())
    	{
    		memcpy(cur,head,sizeof(cur));
    		while((flow=dfs(st,inf)))ans+=flow;
    	}
    	return ans;
    }
    int a[N],b[N],c[110][110];
    signed main()
    {
    	cin>>n>>m,st=0,ed=n+m+1;len=1;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=m;i++)cin>>b[i];
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j];
    	for(int i=1;i<=n;i++)add(st,i,a[i],0);
    	for(int i=1;i<=m;i++)add(i+n,ed,b[i],0);
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    		add(i,j+n,1e18,c[i][j]);
    	dinic();
    	cout<<mn<<'\n';
    	mn=0;len=1;memset(head,0,sizeof(head));
    	for(int i=1;i<=n;i++)add(st,i,a[i],0);
    	for(int i=1;i<=m;i++)add(i+n,ed,b[i],0);
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    		add(i,j+n,1e18,-c[i][j]);
    	dinic();
    	cout<<-mn<<'\n';
    	return 0;
    }
    • 0
      @ 2026-2-7 17:47:31
      #include<cstdio>
      #include<cstring>
      using  namespace  std;
      typedef  long  long  ll;
      ll  n,m;
      struct  node
      {
          ll  next,other,c,d,y;
      }a[210000];ll  last[510],len,st,ed,nn;
      ll  rd[310],cd[310],f[310][310],cost;
      void  ins(ll  x,ll  y,ll  c,ll  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;
      }
      ll  list[1010],head,tail,d[1010];
      bool  v[1010];
      bool  spfa()
      {
          memset(d,20,sizeof(d));d[ed]=0;
          head=1;tail=2;list[head]=ed;
          ll  inf=d[ed+1];
          while(head!=tail)
          {
              ll  x=list[head];
              for(ll  k=last[x];k;k=a[k].next)
              {
                  ll  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])
                          {
                              ll  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  ll  mymin(ll  x,ll  y){return  x<y?x:y;}
      ll  find(ll  x,ll  f)
      {
          v[x]=false;
          if(x==ed){v[x]=true;return  f;}
          ll  ans=0,t=0;
          for(ll  k=last[x];k;k=a[k].next)
          {
              ll  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+=t*a[k].d;
              }
          }
          v[x]=true;
          return  ans;
      }
      int  main()
      {
          scanf("%lld%lld",&n,&m);st=0;ed=n+m+1;nn=n+m+2;
          for(ll  i=1;i<=n;i++)
          {
              scanf("%lld",&rd[i]);
              ins(st,i,rd[i],0);
          }
          for(ll  i=1;i<=m;i++)
          {
              scanf("%lld",&cd[i]);
              ins(n+i,ed,cd[i],0);
          }
          for(ll  i=1;i<=n;i++)
          {
              for(ll  j=1;j<=m;j++)
              {
                  scanf("%lld",&f[i][j]);
                  ins(i,j+n,999999999,f[i][j]);
              }
          }
          memset(v,true,sizeof(v));
          ll  ans=0;
          while(spfa())ans+=find(st,999999999);
          printf("%lld\n",cost);
          cost=0;ans=0;memset(last,0,sizeof(last));
          len=0;
          for(ll  i=1;i<=n;i++)ins(st,i,rd[i],0);
          for(ll  i=1;i<=m;i++)ins(n+i,ed,cd[i],0);
          for(ll  i=1;i<=n;i++)
          {
              for(ll  j=1;j<=m;j++)ins(i,j+n,999999999,-f[i][j]);
          }
          while(spfa())ans+=find(st,999999999);
          printf("%lld\n",-cost);
          return  0;
      }
      
      • 1

      信息

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