| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
样例过了,discuss里的数据过了,但还是WA了呀~OAO~求救呀!直接上代码了~QAQ
#include <cstdio>
#include <cstring>
const long maxn=510;
const long inf=0x3fffffff;
long c[maxn][maxn],f[maxn][maxn],w[maxn][maxn],pnt[maxn];
long value[maxn],d[maxn],mk[maxn],open[maxn],oldque[maxn];
void mincost(long n,long s,long t,long &flow,long &cost)
{
long cur,tail,tl,i,j,u,v;
memset(f,0,sizeof(f));
flow=cost=0;
do{
memset(d,0,sizeof(d));
for(i=1;i<=n;i++) value[i]=inf;
open[0]=s; d[s]=inf; tail=value[s]=0;
while(tail>=0)
{
memset(mk,0,sizeof(mk));
memcpy(oldque,open,sizeof(open));
for(tl=tail,pnt[s]=cur=0,tail=-1;cur<=tl;cur++)
for(u=oldque[cur],v=1;v<=n;v++)
if(f[u][v]<c[u][v] && value[u]<inf && value[u]+w[u][v]<value[v])
{
if(! mk[v]){mk[v]=1; open[++tail]=v;}
pnt[v]=u;
value[v]=value[u]+w[u][v];
if(d[u]<c[u][v]-f[u][v])d[v]=d[u];
else d[v]=c[u][v]-f[u][v];
}
}
if(value[t]==inf) return;
flow+=d[t]; cost+=d[t]*value[t];
for(u=t;u!=s;)
{
v=u; u=pnt[v];
f[u][v]+=d[t];
f[v][u]-=f[u][v];
if(f[u][v]<0)w[u][v]=-w[v][u];
else if(f[v][u]<0)w[v][u]=-w[u][v];
}
}while(d[t]>0);
}
long sum[maxn]={0},flag,a[maxn][maxn],b[maxn][maxn],e[maxn][maxn][maxn];
long n,m,k,ans,saber,flow,s,t;
int main()
{
freopen("1.in","r",stdin);
while(scanf("%ld%ld%ld",&n,&m,&k)!=EOF)
{
if(n==0 && m==0 && k==0)break;
memset(sum,0,sizeof(sum));
for(long i=1;i<=n;i++)
for(long j=1;j<=k;j++)
{
scanf("%ld",&a[i][j]);
sum[j]-=a[i][j];
}
for(long i=1;i<=m;i++)
for(long j=1;j<=k;j++)
{
scanf("%ld",&b[i][j]);
sum[j]+=b[i][j];
}
for(long i=1;i<=k;i++)
for(long j=1;j<=n;j++)
for(long l=1;l<=m;l++)
scanf("%ld",&e[i][j][l]);
flag=1;
for(long i=1;i<=k;i++)
if(sum[i]<0){flag=0;break;}
if(!flag){printf("-1\n");continue;}
s=1; t=m+n+2; saber=0;
for(long z=1;z<=k;z++)
{
memset(c,0,sizeof(c));
memset(w,0,sizeof(w));
for(long i=1;i<=m;i++)
{
c[s][i+1]=b[i][z];
w[s][i+1]=0;
}
for(long i=1;i<=m;i++)
for(long j=m+1;j<=m+n;j++)
{
c[i+1][j+1]=inf;
w[i+1][j+1]=e[z][j-m][i];
}
for(long i=m+1;i<=m+n;i++)
{
c[i+1][t]=a[i-m][z];
w[i+1][t]=0;
}
mincost(m+n+2,s,t,flow,ans);
saber+=ans;
}
printf("%ld\n",saber);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator