求大佬看看
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,M=1e5+5,inf=4557430888798830399;
int n,s,t,dis[N],mcost;
int m,t1,m1,t2,m2;
bool vis[N];
int first[N],nex[M],to[M],w[M],val[N],tot=1;
struct node
{
int v,e;
}pre[N];
void add(int x,int y,int z,int h)
{
nex[++tot]=first[x];
first[x]=tot;
to[tot]=y;
w[tot]=z;
val[tot]=h;
}
bool SPFA()
{
memset(dis,0x3f,sizeof(dis));
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
queue<int>a;
dis[s]=0;a.push(s);vis[s]=1;
while(!a.empty())
{
int x=a.front();a.pop();
vis[x]=0;
for(int i=first[x];i;i=nex[i])
{
int y=to[i];
if(w[i] && dis[y]>dis[x]+val[i])
{
dis[y]=dis[x]+val[i];
pre[y].v=x;pre[y].e=i;
if(vis[y]==0)
{
a.push(y);
vis[y]=1;
}
}
}
}
return dis[t]!=4557430888798830399;
}
int EK()
{
while(SPFA())
{
int Min=inf;
for(int i=t;i!=s;i=pre[i].v)
Min=min(Min,w[pre[i].e]);
for(int i=t;i!=s;i=pre[i].v)
{
w[pre[i].e]-=Min;
w[pre[i].e^1]+=Min;
}
mcost+=dis[t]*Min;
}
}
signed main()
{
scanf("%lld",&n);
s=0,t=2*n+1;
int x;
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
add(s,i,x,0);add(i,s,0,0);
add(i+n,t,x,0);add(t,i+n,0,0);
}
scanf("%lld%lld%lld%lld%lld",&m,&t1,&m1,&t2,&m2);
for(int i=1;i<=n;i++)
{
if(i+1<=n) add(i,i+1,inf,0),add(i+1,i,0,0);
if(i+t1<=n) add(i,i+n+t1,inf,m1),add(i+n+t1,i,0,-m1);
if(i+t2<=n) add(i,i+n+t2,inf,m2),add(i+n+t2,i,0,-m2);
add(s,i+n,inf,m),add(i+n,s,0,-m);
}
EK();
cout<<mcost;
return 0;
}