记录编号 157717 评测结果 AAAAAAAAAA
题目名称 [网络流24题] 数字梯形 最终得分 100
用户昵称 Gravatarvampire 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2015-04-09 21:19:32 内存使用 4.35 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int point[1500]={0},next[10000]={0},tot,n,m,map[50][50],l[1000000],dis[1500],pre[1500],num[30]={0},sum[30]={0};
bool f[1500];
struct S{
	int st,en,va,co;
}aa[10000];
inline void add(int i,int j,int x,int y)
{
	tot+=1;next[tot]=point[i];point[i]=tot;
	aa[tot].st=i;aa[tot].en=j;aa[tot].va=x;aa[tot].co=y;
	tot+=1;next[tot]=point[j];point[j]=tot;
	aa[tot].st=j;aa[tot].en=i;aa[tot].va=0;aa[tot].co=-y;
}
inline int SPFA(int x,int y)
{
	memset(f,1,sizeof(f));
	memset(dis,128,sizeof(dis));
	memset(pre,0,sizeof(pre));
	int i,j,u,h=1,t=1;
	dis[x]=0;l[h]=x,pre[x]=x;
	while(h<=t){
		u=l[h];f[u]=true;
		for(i=point[u];i;i=next[i]){
			if(aa[i].va>0&&dis[aa[i].en]<dis[u]+aa[i].co){
				dis[aa[i].en]=dis[u]+aa[i].co;
				pre[aa[i].en]=i;
				if(f[aa[i].en]){
					t+=1;
					f[aa[i].en]=false;
					l[t]=aa[i].en;
				}
			}
		}
		h+=1;
	}
	return dis[y]<0?0:dis[y];
} 
inline int ISAP(int x,int y)
{
	int i,minn=210000000;
	for(i=y;i!=x;i=aa[pre[i]].st){
		minn=min(minn,aa[pre[i]].va);
	}
	for(i=y;i!=x;i=aa[pre[i]].st){
		aa[pre[i]].va-=minn;
		aa[pre[i]^1].va+=minn;
	}
	return minn;
}
int main()
{
	freopen("digit.in","r",stdin);
	freopen("digit.out","w",stdout);
	int i,j,N,T,num1,num2,minn,ans;
	scanf("%d%d",&m,&n);
	for(i=1;i<=n;++i)
	  for(j=1;j<=m+i-1;++j)
	    scanf("%d",&map[i][j]);	
	N=(m*2+n-1)*n/2;
	for(i=1;i<=n;++i) num[i]=num[i-1]+m+i-1,sum[i]=m+i-1;
    /*-----------work1-----------*/
    tot=1;T=N*2-m+2;
	for(i=1;i<=m;++i) add(1,i+1,1,0);
	for(i=1;i<=m;++i) {add(i+1,i+m+1,1,map[1][i]);add(i+1,i+m+2,1,map[1][i]);}
	for(i=2;i<n;++i){
		for(j=1;j<=sum[i];++j){
			add(num[i]*2-m-sum[i]+1+j,num[i]*2-m+1+j,1,map[i][j]);
			add(num[i]*2-m-sum[i]+1+j,num[i]*2-m+2+j,1,map[i][j]);
		}
	}
	for(i=1;i<=sum[n];++i) add(num[n]*2-m-sum[n]+1+i,T,1,map[n][i]);
	for(i=2;i<=n;++i){
		for(j=1;j<=sum[i];++j){
			add(num[i-1]*2-m+1+j,num[i-1]*2-m+1+j+sum[i],1,0);
		}
	}
	minn=1;ans=0;
	while(minn){
		minn=SPFA(1,T);
		if(minn) ans+=minn*ISAP(1,T);
	}
	printf("%d\n",ans);
	/*-----------work2-----------*/
	memset(point,0,sizeof(point));
	memset(next,0,sizeof(next));
	tot=1;T=N+2;	
	for(i=1;i<=m;++i) add(1,i+1,1,0);
	for(i=1;i<n;++i){
		for(j=1;j<=sum[i];++j){
			add(1+num[i-1]+j,1+num[i-1]+j+sum[i],1,map[i][j]);
			add(1+num[i-1]+j,2+num[i-1]+j+sum[i],1,map[i][j]);
		}
	}
	for(i=1;i<=sum[n];++i) add(1+num[n-1]+i,T,m,map[n][i]);
	minn=1;ans=0;
	while(minn){
		minn=SPFA(1,T);
		if(minn) ans+=minn*ISAP(1,T);
	}
	printf("%d\n",ans);
	/*-----------work3-----------*/
	memset(point,0,sizeof(point));
	memset(next,0,sizeof(next));
	tot=1;T=N+2;	
	for(i=1;i<=m;++i) add(1,i+1,1,0);
	for(i=1;i<n;++i){
		for(j=1;j<=sum[i];++j){
			add(1+num[i-1]+j,1+num[i-1]+j+sum[i],m,map[i][j]);
			add(1+num[i-1]+j,2+num[i-1]+j+sum[i],m,map[i][j]);
		}
	}
	for(i=1;i<=sum[n];++i) add(1+num[n-1]+i,T,m,map[n][i]);
	minn=1;ans=0;
	while(minn){
		minn=SPFA(1,T);
		if(minn) ans+=minn*ISAP(1,T);
	}
	printf("%d\n",ans);
}