49分,剩下全T,各位巨佬们救救本蒟蒻吧
查看原帖
49分,剩下全T,各位巨佬们救救本蒟蒻吧
381600
封禁用户楼主2022/1/24 17:00

也不知道错在哪里 求求各位巨佬了

#include<bits/stdc++.h>
using namespace std;
int n,m;
int head[101010];
bool vis[101010];
const int inf=1e9;
int s=1e5+1,t=1e5+2;
int cnt=1;
int dis[101010];
int a[1005][1005];
int b[1005][1005];
struct kk{
	int v;
	int val;
	int next;
	int w;
}node[201010];
struct P{
	int v;
	int edge;
}pre[101010];
void add(int u,int v,int val,int w)
{
	node[++cnt].v=v;
	node[cnt].w=w;
	node[cnt].val=val;
	node[cnt].next=head[u];
	head[u]=cnt;
}
inline int read()//快读 
{
	int x=0;
	char c=getchar();
	while(c>'9'||c<'0')c=getchar();
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
bool spfa()
{
	queue<int> q;
	memset(pre,0,sizeof(pre));
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	vis[s]=1;
	dis[s]=0;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		vis[u]=0;
		q.pop();
		for(int i=head[u];i!=0;i=node[i].next)
		{
			int d=node[i].v;
			int w=node[i].w;
			if(node[i].val>0&&dis[d]>dis[u]+w)
			{
				dis[d]=dis[u]+w;
				pre[d].v=u;
				pre[d].edge=i;
				if(vis[d]==0)
				{
					q.push(d);
					vis[d]=1;
				}
			}
		}
	}
	return dis[t]!=0x3f3f3f3f;
}
int EK()
{
	int mi;
	int cost=0;
	while(spfa())
	{
		mi=inf;
		for(int i=t;i!=s;i=pre[i].v)
		{
			mi=min(mi,node[pre[i].edge].val);
		}
		for(int i=t;i!=s;i=pre[i].v)
		{
			node[pre[i].edge].val-=mi;
			node[pre[i].edge^1].val+=mi;
		}
		cost+=mi*dis[t]; 
	}
	return cost;
}
void qk()
{
	cnt=1;
	memset(node,0,sizeof(node));
	memset(head,0,sizeof(head));
}
int main()
{
	int kk,k,nt=0;
	m=read();
	n=read();
	s=0;
	k=m;
	kk=(((m*n)<<1)+n*n-n)>>1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=k;j++) 
		{
			a[i][j]=read();
			++nt;
			b[i][j]=nt; 
		}
		k++;
	}
	for(int i=1;i<=m;i++)
	{
		add(s,b[1][i],1,0);
		add(b[1][i],s,0,0);
	}	
	k=m;
	for(int i=1;i<n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			add(b[i][j],b[i][j]+kk,1,-a[i][j]);
			add(b[i][j]+kk,b[i][j],0,a[i][j]);
			add(b[i][j]+kk,b[i+1][j],1,0);
			add(b[i+1][j],b[i][j]+kk,0,0);
			add(b[i][j]+kk,b[i+1][j+1],1,0);
			add(b[i+1][j+1],b[i][j]+kk,0,0);
		}
		k++;
	}	
	for(int i=1;i<=k;i++)
	{
		add(b[n][i],b[n][i]+kk,1,-a[n][i]);
		add(b[n][i]+kk,b[n][i],0,a[n][i]);
		add(b[n][i]+kk,t,1,0);
		add(t,b[n][i]+kk,0,0);
	}
	printf("%d\n",-EK());
	
	
	qk();
	k=m;
	for(int i=1;i<=m;i++)
	{
		add(s,b[1][i],1,0);
		add(b[1][i],s,0,0);
	}

	k=m;
	for(int i=1;i<n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			add(b[i][j],b[i+1][j],1,-a[i][j]);
			add(b[i+1][j],b[i][j],0,a[i][j]);
			add(b[i][j],b[i+1][j+1],1,-a[i][j]);
			add(b[i+1][j+1],a[i][j],0,a[i][j]);
		}
		k++;
	}	
	for(int i=1;i<=k;i++)
	{
		add(b[n][i],t,inf,-a[n][i]);
		add(t,b[n][i],0,a[n][i]);
	}
	printf("%d\n",-EK());
	
	
	qk();
	k=m;
	for(int i=1;i<=m;i++)
	{
		add(s,b[1][i],1,0);
		add(b[1][i],s,0,0);
	}
	for(int i=1;i<n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			add(b[i][j],b[i+1][j],inf,-a[i][j]);
			add(b[i+1][j],b[i][j],0,a[i][j]);
			add(b[i][j],b[i+1][j+1],inf,-a[i][j]);
			add(b[i+1][j+1],b[i][j],0,a[i][j]);
		}
		k++;
	}
	for(int i=1;i<=k;i++)
	{
		add(b[n][i],t,inf,-a[n][i]);
		add(t,b[n][i],0,a[n][i]);
	}
	printf("%d",-EK());
	return 0;
}
2022/1/24 17:00
加载中...