2 条题解

  • 0
    @ 2026-3-25 19:21:02
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e6+10;
    const int inf=1e18;
    int n,m,st,ed,mincost,a[50][50],cnt[50];
    struct node{int to,v,c,nxt;}e[N];
    int head[N],cur[N],d[N],len;
    int vis[N];
    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;
    }
    bool spfa()
    {
    	for(int i=0;i<=ed;i++)d[i]=inf;
    	memset(vis,0,sizeof(vis));
    	queue<int>q;
    	q.push(st);
    	d[st]=0;
    	vis[st]=1;
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		vis[x]=0;
    		for(int i=head[x];i;i=e[i].nxt)
    		{
    			int y=e[i].to;
    			if(e[i].v&&d[y]>d[x]+e[i].c)
    			{
    				d[y]=d[x]+e[i].c;
    				if(!vis[y])q.push(y),vis[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].v&&d[y]==d[x]+e[i].c)
    		{
    			int sum=dfs(y,min(res-ans,e[i].v));
    			e[i].v-=sum;
    			e[i^1].v+=sum;
    			mincost+=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 getin(int x,int y){return (cnt[x-1]+y)*2-1;}
    int getout(int x,int y){return (cnt[x-1]+y)*2;}
    void solve(int p,int t)
    {
    	len=1;
    	memset(head,0,sizeof(head));
    	for(int i=1;i<=m;i++)add(st,getin(1,i),1,0);
    	for(int i=1;i<=m+n-1;i++)add(getout(n,i),ed,inf,0);
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m+i-1;j++)
    		{
    			add(getin(i,j),getout(i,j),p,a[i][j]);
    			if(i<n)
    			{
    				add(getout(i,j),getin(i+1,j),t,0);
    				add(getout(i,j),getin(i+1,j+1),t,0);
    			}
    		}
    	}
    	mincost=0;
    	dinic();
    	cout<<-mincost<<'\n';
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0),cout.tie(0);
    	cin>>m>>n;
    	cnt[0]=0;
    	for(int i=1;i<=n;i++)cnt[i]=cnt[i-1]+(m+i-1);
    	st=0,ed=cnt[n]*2+1;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m+i-1;j++)
    			cin>>a[i][j];
    	solve(1,1);
    	solve(inf,1);
    	solve(inf,inf);
    	return 0;
    }
    • 0
      @ 2026-2-7 17:45:28
      #include<cstdio>
      #include<cstring>
      using  namespace  std;
      struct  node
      {
          int  y,c,d,flog,next,other;
      }a[210000];int  len,last[21000],n,m,st,ed,f[30][60],ans,cost;
      struct  node1
      {
          int  c,r,f;
      }zx[30][60];
      void  ins(int  x,int  y,int  c,int  d,int  flog)
      {
          len++;
          a[len].y=y;a[len].c=c;a[len].d=d;a[len].flog=flog;
          a[len].next=last[x];last[x]=len;
          len++;
          a[len].y=x;a[len].c=0;a[len].d=-d;a[len].flog=0;
          a[len].next=last[y];last[y]=len;
          a[len].other=len-1;
          a[len-1].other=len;
      }
      int   list[21000],head,tail,dis[21000],flow[21000],d[21000],b[21000];
      bool  v[21000];
      inline  int  mymin(int  x,int  y){return  x<y?x:y;}
      bool  spfa()
      {
          memset(dis,20,sizeof(dis));v[st]=false;dis[st]=0;
          int  inf=dis[st+1];
          head=1;tail=2;list[head]=st;
          while(head!=tail)
          {
              int  x=list[head];
              for(int  k=last[x];k;k=a[k].next)
              {
                  int  y=a[k].y;
                  if(a[k].c>0  &&  dis[x]+a[k].d<dis[y])
                  {
                      dis[y]=dis[x]+a[k].d;
                      flow[y]=mymin(flow[x],a[k].c);
                      d[y]=x;b[y]=k;
                      if(v[y]==true)
                      {
                      	v[y]=false;
                      	if(dis[list[head+1]]>dis[y])
                      	{
                      		int  all=head;
                      		head--;if(head==0)head=ed+1;
                      		list[head]=list[all];list[all]=y;
      					}
      					else
      					{
      						list[tail++]=y;if(tail==ed+2)tail=1;
      					}
      				}
                  }
              }
              head++;if(head==ed+2)head=1;v[x]=true;
          }
          if(dis[ed]==inf)return  false;
          int  y=ed,root=0;
          while(y>0)
          {
          	root=b[y];y=d[y];
          	a[root].c-=flow[ed];a[a[root].other].c+=flow[ed];
      	}
      	cost+=flow[ed]*dis[ed];
      	return  true;
      }
      int  main()
      {
          scanf("%d%d",&m,&n);
          for(int  i=1;i<=n;i++)
          {
              int  edd=i+m-1;
              for(int  j=1;j<=edd;j++)
              {
                  scanf("%d",&zx[i][j].f);
                  zx[i][j].r=ed+1;zx[i][j].c=ed+2;ed+=2;
                  ins(zx[i][j].r,zx[i][j].c,1,-zx[i][j].f,1);
              }
          }
          ed++;
          for(int  i=1;i<=m;i++)ins(st,zx[1][i].r,1,0,3);
          for(int  i=1;i<n;i++)
          {
              int  edd=m+i-1;
              for(int  j=1;j<=edd;j++)
              {
                  ins(zx[i][j].c,zx[i+1][j].r,1,0,2);
                  ins(zx[i][j].c,zx[i+1][j+1].r,1,0,2);
              }
          }
          int  edd=m+n-1;
          for(int  i=1;i<=edd;i++)ins(zx[n][i].c,ed,1,0,1);
          flow[st]=999999999;
          memset(v,true,sizeof(v));
          while(spfa());
          printf("%d\n",-cost);
          for(int  i=1;i<=len;i++)
          {
          	if(a[i].flog==0)a[i].c=0;
          	else  if(a[i].flog==1)a[i].c=999999999;
          	else  a[i].c=1;
      	}
      	cost=0;
      	while(spfa());
      	printf("%d\n",-cost);
      	for(int  i=1;i<=len;i++)
      	{
      		if(a[i].flog==0)a[i].c=0;
          	else  if(a[i].flog<=2)a[i].c=999999999;
          	else  a[i].c=1;
      	}
      	cost=0;
      	while(spfa());
      	printf("%d\n",-cost);
          return  0;
      }
      
      • 1

      信息

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