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 |
贴代码#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define N 305 #define NN 100000 #define M NN #define inf 0x3fffffff using namespace std; struct Syndra { int u,v,w,len,next; }e[M]; int head[N],cnt;//for Syndra int pre[N],mc[N],s,t;//for costflow int need[N][N],offer[N][N],carriage[N][N][N];//for build int spfa(int s,int t) { int i,j,k; int u,v; int dist[N],visit[N]; queue<int>q; memset(dist,0x3f,sizeof(dist)); memset(visit,0,sizeof(visit)); memset(pre,-1,sizeof(pre)); memset(mc,0x3f,sizeof(mc)); dist[s]=0; visit[s]=1; q.push(s); while(!q.empty()) { u=q.front(); q.pop(); visit[u]=0; for(i=head[u];i;i=e[i].next) { v=e[i].v; if(e[i].len&&dist[v]>dist[u]+e[i].w) { dist[v]=dist[u]+e[i].w; pre[v]=i; mc[v]=min(mc[u],e[i].len); if(!visit[v]) { q.push(v); visit[v]=1; } } } } if(dist[t]<0x3f3f3f3f)return dist[t]; else return -1; } void handle(int flow) { int i; for(i=t;pre[i]+1;i=e[pre[i]].u) { e[pre[i]].len-=flow; e[pre[i]^1].len+=flow; } } void add(int u,int v,int w,int len) { ++cnt; e[cnt].u=u; e[cnt].v=v; e[cnt].w=w; e[cnt].len=len; e[cnt].next=head[u]; head[u]=cnt; } void build(int n,int m,int p) { int i,j,k; memset(head,0,sizeof(head)); cnt=1;s=0;t=n+m+1; for(i=1;i<=m;i++) { add(s,i,0,offer[p][i]); add(i,s,0,0); } for(i=1;i<=n;i++) { add(i+m,t,0,need[p][i]); add(t,i+m,0,0); } for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { add(i,j+m,carriage[p][i][j],inf); add(j+m,i,-carriage[p][i][j],0); } } } int main() { // freopen("test.in","r",stdin); int i,j,k; int ans,sum; int n,m,p; int sum_of_offer[N],sum_of_need[N],flag; while(scanf("%d%d%d",&n,&m,&p),n+m+p) { ans=0;flag=1; memset(sum_of_need,0,sizeof(sum_of_need)); memset(sum_of_offer,0,sizeof(sum_of_offer)); for(i=1;i<=n;i++)for(j=1;j<=p;j++)scanf("%d",&need[j][i]),sum_of_need[j]+=need[j][i]; for(i=1;i<=m;i++)for(j=1;j<=p;j++)scanf("%d",&offer[j][i]),sum_of_offer[j]+=offer[j][i]; for(i=1;i<=p;i++)for(j=1;j<=n;j++)for(k=1;k<=m;k++)scanf("%d",&carriage[i][k][j]); for(i=1;i<=p;i++) { if(sum_of_offer[i]<sum_of_need[i]) { flag=0; break; } } if(!flag) { printf("-1\n"); continue; } for(i=1;i<=p;i++) { build(n,m,i); sum=0; while(k=spfa(s,t),k+1) { sum+=mc[t]*k; handle(mc[t]); } ans+=sum; } printf("%d\n",ans); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator