记录编号 34714 评测结果 AAAAAAAAAAAA
题目名称 [网络流24题] 餐巾 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.053 s
提交时间 2011-12-31 11:17:36 内存使用 0.38 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<deque>

using namespace std;

const int oo=~0u>>1;

struct type
{
	int t,w,cost;
	type *next,*back;
	type(int _t,int _w,int _cost,type *_next):t(_t),w(_w),cost(_cost),next(_next){}
}*Map[10010];

int n,p,fw,sw,fc,sc,s,t,ans,r[10010],pre[10010];

void addedge(int v,int t,int w,int cost)
{
	Map[v]=new type(t,w,cost,Map[v]);
	Map[t]=new type(v,0,-cost,Map[t]);
	Map[v]->back=Map[t];
	Map[t]->back=Map[v];
}

void minCmaxF()
{
	deque<int>deq;
	int i,j,dist[10010],u,maxflow;
	bool v[10010];
	type *k,*path[10010];
	for(;;)
	{
		memset(v,false,sizeof(v));
		for(i=1;i<=10000;i++)
			dist[i]=oo;
		dist[s]=0;
		deq.push_back(s);
		while(!deq.empty())
		{
			u=deq.front();
			deq.pop_front();
			v[u]=false;
			for(k=Map[u];k;k=k->next)
			{
				j=k->t;
				if(dist[j]>dist[u]+k->cost&&k->w>0)
				{
					dist[j]=dist[u]+k->cost;
					pre[j]=u;
					path[j]=k;
					if(!v[j])
					{
						v[j]=true;
						if(dist[j]>dist[u])
							deq.push_back(j);
						else
							deq.push_front(j);
					}
				}
			}
		}
		if(dist[t]==oo)
		{
			printf("%d\n",ans);
			return;
		}
		maxflow=oo;
		i=t;
		while(i!=s)
		{
			k=path[i];
			maxflow=min(k->w,maxflow);
			i=pre[i];
		}
		i=t;
		while(i!=s)
		{
			k=path[i];
			k->w-=maxflow;
			k->back->w+=maxflow;
			i=pre[i];
		}
		ans+=dist[t]*maxflow;
	}
}

int main()
{
	int i;
	freopen("napkin.in","r",stdin);
	freopen("napkin.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&r[i]);
	scanf("%d%d%d%d%d",&p,&fw,&fc,&sw,&sc);
	s=n*2+1;
	t=s+1;
	for(i=1;i<=n;i++)
	{
		addedge(s,i,r[i],0);
		addedge(n+i,t,r[i],0);
		addedge(s,n+i,oo,p);
		if(i<n)
			addedge(i,i+1,oo,0);
		if(i+fw<=n)
			addedge(i,i+fw+n,oo,fc);
		if(i+sw<=n)
			addedge(i,i+sw+n,oo,sc);
	}
	minCmaxF();
	return 0;
}