记录编号 153750 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 数字梯形 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.006 s
提交时间 2015-03-19 07:50:07 内存使用 0.42 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=1e9;
int temp[21][45]={0},zz=0,zhi[21][45]={0};

int i,p,zj1,zj2,zj3,n,m,ans1,ans2,ans3,ST,SD;
int to[4500]={0},ne[4500]={0},head[1700]={0},w[4500]={0},r[4500]={0},sj=1;
inline void addedge(int u,int v,int W)
{
	to[++sj]=v,ne[sj]=head[u],head[u]=sj,w[sj]=W;
	to[++sj]=u,ne[sj]=head[v],head[v]=sj,w[sj]=-W;
}

int que[1700]={0},qhead=1,qtail=0;bool flag[1700]={0};
inline void PUSH(int x)
{flag[x]=1,que[0]++;if(++qtail==1700)qtail=1;que[qtail]=x;}
inline int GET()
{int x=que[qhead];que[0]--,flag[x]=0;if(++qhead==1700)qhead=1;return x;}


int dis[1710]={0},pres[1710]={0},pre[1700]={0};
void init()
{
	scanf("%d%d",&n,&m);zj1=n;
	for(i=1;i<=m;i++,zj1++)for(p=1;p<=zj1;p++)
	scanf("%d",&zhi[i][p]),temp[i][p]=++zz;
	zj1=n;
	for(i=1;i<m;i++,zj1++)for(p=1;p<=zj1;p++)
	{
		addedge(temp[i][p],temp[i+1][p],zhi[i][p]);
		addedge(temp[i][p],temp[i+1][p+1],zhi[i][p]);
	}
	SD=zz+1;
	for(p=1;p<=zj1;p++)addedge(temp[i][p],SD,zhi[i][p]);
	for(i=1;i<=n;i++)
	{
		PUSH(i);
		for(p=1;p<=SD;p++)dis[p]=-INF;dis[i]=0;
		while(que[0])
		for(zj1=GET(),p=head[zj1];p;p=ne[p])
		if(to[p]>zj1&&dis[to[p]]<dis[zj1]+w[p])
		{
			
			dis[to[p]]=dis[zj1]+w[p];
			if(!flag[to[p]])PUSH(to[p]);
		}
		ans3+=dis[SD];
	}
}

inline bool spfa()
{
	for(i=1;i<=ST;i++)dis[i]=-INF;
	dis[ST]=0;PUSH(ST);
	while(que[0])
	{
		zj1=GET();
		for(i=head[zj1];i;i=ne[i])
		if(r[i]&&(dis[to[i]]<(zj2=dis[zj1]+w[i])))
		{
			dis[to[i]]=zj2,pre[to[i]]=zj1,pres[to[i]]=i;
			if(!flag[to[i]])PUSH(to[i]);
		}
	}
	if(dis[SD]==-INF)return 0;
	return 1;
}
 
inline int work()
{
	for(zj1=SD;zj1!=ST;zj1=pre[zj1])
	r[pres[zj1]]--,r[pres[zj1]^1]++;
	return dis[SD];
}

void Make()
{
	ST=SD+1;
	for(i=1;i<=n;i++)addedge(ST,temp[1][i],0);
	for(i=2;i<=sj;i+=2)r[i]=1;
	for(i=head[SD];i;i=ne[i])r[i^1]=INF;
	while(spfa())ans2+=work();
}

void End_()
{
	sj=1;memset(head,0,sizeof(head));zj1=n;
	for(i=1;i<m;i++,zj1++)for(p=1;p<=zj1;p++)
	{
		addedge(temp[i][p],temp[i][p]+zz,0);r[sj]=0;
		addedge(temp[i][p]+zz,temp[i+1][p],zhi[i][p]);r[sj]=0;
		addedge(temp[i][p]+zz,temp[i+1][p+1],zhi[i][p]);r[sj]=0;
	}
	SD=zz*2+1;ST=SD+1;
	for(p=1;p<=zj1;p++)
	{
		addedge(temp[i][p],temp[i][p]+zz,0),r[sj]=0;
		addedge(temp[i][p]+zz,SD,zhi[i][p]),r[sj]=0;
	}
	for(i=1;i<=n;i++)
	addedge(ST,temp[1][i],0),r[sj]=0;
	for(i=2;i<=sj;i+=2)r[i]=1;
	while(spfa())ans1+=work();
}
int main()
{
	freopen("digit.in","r",stdin);
	freopen("digit.out","w",stdout);
	init();
	Make();
	End_();
	printf("%d\n",ans1);
	printf("%d\n",ans2);
	printf("%d\n",ans3);
	return 0;
}