2 条题解

  • 0
    @ 2026-3-24 20:36:39
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=5005,M=100010;
    const int inf=1e18;
    int n,st,ed,mn;
    struct node{int to,v,c,nxt;}e[M<<1];
    int head[N],cur[N],d[N],len;
    bool vis[N];
    int c[60][60];
    void add(int x,int y,int w,int cost)
    {
    	e[++len]={y,w,cost,head[x]};head[x]=len;
    	e[++len]={x,0,-cost,head[y]};head[y]=len;
    }
    bool spfa()
    {
    	for(int i=0;i<=n*2+1;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;
    			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;
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0),cout.tie(0);
    	cin>>n;
    	st=0,ed=n*2+1,len=1;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			cin>>c[i][j];
    	for(int i=1;i<=n;i++)add(st,i,1,0);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			add(i,j+n,1,c[i][j]);
    	for(int i=1;i<=n;i++)add(i+n,ed,1,0);
    	dinic();
    	cout<<mn<<'\n';
    	len=1;
    	memset(head,0,sizeof(head));
    	mn=0;
    	for(int i=1;i<=n;i++)add(st,i,1,0);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			add(i,j+n,1,-c[i][j]);
    	for(int i=1;i<=n;i++)add(i+n,ed,1,0);
    	dinic();
    	cout<<-mn<<'\n';
    	return 0;
    }
    • 0
      @ 2026-2-7 17:27:31
      #include<cstdio>
      #include<cstring>
      using  namespace  std;
      struct  node
      {
      	int  y,c,d,next,other;
      }a[21000];int  len,last[400],n,st,ed,cost,m,f[105][105];
      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[400],head,tail,dis[400],flow[400],d[400],b[400];
      bool  v[400];
      inline  int  mymin(int  x,int  y){return  x<y?x:y;}
      bool  spfa()
      {
      	memset(dis,20,sizeof(dis));dis[st]=0;
      	head=1;tail=2;list[head]=st;
      	int  inf=dis[ed+1];
      	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);
      				b[y]=k;d[y]=x;
      				if(v[y]==true)
      				{
      					v[y]=false;
      					if(d[list[head+1]]>d[y])
      					{
      						int  all=head;
      						head--;if(head==0)head=m;
      						list[head]=list[all];list[all]=y;
      					}
      					else
      					{
      						list[tail++]=y;if(tail==m+1)tail=1;
      					}
      				}
      			}
      		}
      		head++;if(head==m+1)head=1;
      		v[x]=true;
      	}
      	return  dis[ed]!=inf;
      }
      int  main()
      {
      	scanf("%d",&n);st=0;ed=n*2+1;m=n*2+2;
      	for(int  i=1;i<=n;i++)
      	{
      		for(int  j=1;j<=n;j++)
      		{
      			scanf("%d",&f[i][j]);
      			ins(i,j+n,1,f[i][j]);
      		}
      		ins(st,i,1,0);ins(i+n,ed,1,0);
      	}
      	flow[st]=999999999;
      	memset(v,true,sizeof(v));
      	while(spfa())
      	{
      		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+=dis[ed]*flow[ed];
      	}
      	printf("%d\n",cost);cost=0;
      	len=0;memset(last,0,sizeof(last));
      	for(int  i=1;i<=n;i++)
      	{
      		for(int  j=1;j<=n;j++)ins(i,j+n,1,-f[i][j]);
      		ins(st,i,1,0);ins(i+n,ed,1,0);
      	}
      	while(spfa())
      	{
      		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+=dis[ed]*flow[ed];
      	}
      	printf("%d\n",-cost);
      	return  0;
      }
      
      • 1

      信息

      ID
      955
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      8
      已通过
      7
      上传者